本文摘自PHP中文网,作者黄舟,侵删。
一、消息队列
1.1 消息队列
消息队列是用来存放消息的一个队列,消息在队列中先入先出,所有的窗口程序都具有消息队列,程序可以从队列中获取消息。
1.2 消息队列的类型
系统消息队列:由操作系统维护的消息队列,存放系统产生的消息,如鼠标、键盘消息等等。
程序消息队列:属于每一个应用程序(线程)的消息队列,用应用程序维护。
当产生鼠标、键盘等消息时,消息先存放到系统消息队列,然后操作系统根据存放的消息找到对应的窗口的消息队列,将消息投递到窗口的消息队列中。
1.3 队列消息和非队列消息
队列消息:消息发出后,首先放入队列,然后通过消息循环获取。常见的队列消息:键盘、鼠标、定时器消息等等。
非队列消息:消息发出后,直接找到窗口的消息处理函数,调用消息处理函数进行处理,无需经过消息队列。常见的非队列消息:WM_PAINT、WM_SIZE等等。
二、消息循环和GetMessage/PeekMessage
2.1 消息循环
一般的消息循环如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
GetMessage/PeekMessage:从程序的消息队列当中获取消息。
TranslateMessage:将键盘上的按键等消息翻译成字符消息。
DispatchMessage:将翻译后的消息再次放入到程序的消息队列中。
2.2 GetMessage和PeekMessage
1 2 3 4 5 6 |
|
lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
wMsgFilterMin:指定被检索的最小消息值的整数。
wMsgFilterMax:指定被检索的最大消息值的整数。
返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数。
1 2 3 4 5 6 7 |
|
lpMsg:接收消息信息的MSG结构指针。
hWnd:其消息被检查的窗口句柄。
wMsgFilterMin:指定被检查的消息范围里的第一个消息。
wMsgFilterMax:指定被检查的消息范围里的最后一个消息。
wRemoveMsg:确定消息如何被处理。此参数可取下列值之一:
相关阅读 >>
win32 sdk基础(十一)之消息队列和getmessage/peekmessage、sendmessage/postmesage的详解
win32 sdk基础(一)之windows程序分类以及库和头文件所在目录的详解
win32 sdk基础(十二)之wm_paint消息的处理(图)
win32 sdk基础(三)之如何从零开始创建windows窗口的第一步
win32 sdk基础(六)之详解窗口类的查找过程和相关api
更多相关阅读请进入《win32》频道 >>