解释一下Windows的消息机制
Windows是一个消息(Message)驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。
Windows系统中有两种消息队列:系统消息队列和应用程序消息队列。计算机的所有输入设备由Windows监控。当一个事件发生时,Windows先将输入的消息放入系统消息队列中,再将消息拷贝到相应的`应用程序消息队列中。应用程序的消息处理程序将反复检测消息队列,并把检测到的每个消息发送到相应的窗口函数中。这便是一个事件从发生至到达窗口函数必须经历的过程。
必须注意的是,消息并非是抢占性的,无论事件的缓急,总是按照到达的先后派对,依次处理(一些系统消息除外),这样可能使一些实时外部事件得不到及时处理。
Windows中的消息是放在对应的进程的消息队列里的。可以通过GetMessage取得,并且对于一般的消息,此函数返回非零值,但是对于 WM_QUIT消息,返回零。可以通过这个特征,结束程序。当取得消息之后,应该先转换消息,再分发消息。所谓转换,就是把键盘码的转换,所谓分发,就是把消息分发给对应的窗口,由对应的窗口处理消息,这样对应窗体的消息处理函数就会被调用。两个函数可以实现这两个功能:TranslateMessage 和DispatchMessage。
另外,需要注意,当我们点击窗口的关闭按钮关闭窗口时,程序并没有自动退出,而是向程序发送了一个WM_DESTROY消息(其实过程是这样的,首先向程序发送WM_CLOSE消息,默认的处理程序是调用DestroyWindow销毁窗体,从而引发WM_DESTROY消息),此时在窗体中我们要响应这个消息,如果需要退出程序,那么就要向程序发送WM_QUIT消息(通过PostQuitMessage实现)。一个窗体如果想要调用自己的消息处理函数,可以使用SendMessage向自己发消息。
如上所述,大部分(注意是大部分)的消息是这样传递的:首先放到进程的消息队列中,之后由GetMessage取出,转换后,分发给对应的窗口。这种消息成为存储式消息。存储式消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP讯息)、击键产生的字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)的形式给出。存储式消息还包含时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)。
但是也有的消息是直接发送给窗口的,它们被称为非存储式消息。例如,当WinMain调用 CreateWindow时,Windows将建立窗口并在处理中给窗口消息处理函数发送一个WM_CREATE消息。当WinMain调用 ShowWindow时,Windows将给窗口消息处理函数发送WM_SIZE和WM_SHOWWINDOW消息。当WinMain调用 UpdateWindow时,Windows将给窗口消息处理函数发送WM_PAINT消息。
-
2016年牡丹江医学院复试分数线公布
牡丹江医学院已经将2016年复试分数线公布了,有需要的朋友们可以看看一看,下面是小编搜集整理的相关资料,欢迎阅读。2016年牡丹江医学院硕士研究生复试分数线与国家初试成绩要求相同。学科门类(专业)名称A类地区考生总分单科(满分=100分)单科(满分>100分)理学[07]2853959...
-
2017考研英语新题型做题方法
新题型是考研英语复习的一大部分,下面小编整理分析了新题型的做题方法,希望对2017年考生有所帮助。对新题型部分的要求也是一样,仍是考查考生对诸如连贯性、一致性等语段特征以及文章结构的理解。本部分有三种备选题型,分别为:1)在一篇总长度为500-600词的文章中有5...
-
2017考研英语语法:分词
分词有现在分词和过去分词两种。考生们在复习考研英语的时候要对分词进行充分了解,下面就跟着小编一起去了解关于分词的语法吧!作为谓语,现在分词和be一起构成进行时;过去分词和be一起构成被动语态,和have一起构成完成时。例如:IamreadinganovelbyMaupassant.我正...
-
考研现场确认的四大细节
下面是小编为大家整理的考研现场确认的四大细节,欢迎大家的阅读。一、带齐证件和材料:在11月10日之前,做好一切准备工作。一定记住,学校老师办公和现场确认都只有五天时间。现在有问题,还来得及处理,不要等到最后一天才发现有问题。现场确认就是为了核对考生信息,以防...