Win32 SDK基础(十一)之消息队列和GetMessage/PeekMessage、SendMessage/Postmesage的详解


本文摘自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

void Message(HWND hWnd) 

    MSG nMsg = { 0 };

    while (GetMessage(&nMsg, hWnd, 0, 0)) 

    

        TranslateMessage(&nMsg); 

        DispatchMessage(&nMsg); 

 

        if(nMsg.message == WM_PAINT)

        {

            char buff[30]={};

            sprintf(buff,"处理消息%d\n",nMsg.message);

            WriteConsole(hOutput,buff,sizeof(buff),NULL,NULL);

        }

    

}

GetMessage/PeekMessage:从程序的消息队列当中获取消息。

TranslateMessage:将键盘上的按键等消息翻译成字符消息。

DispatchMessage:将翻译后的消息再次放入到程序的消息队列中。

2.2 GetMessage和PeekMessage

1

2

3

4

5

6

GetMessage(

LPMSG lpMsg,

HWND hWnd,

UINT wMsgFilterMin,

UINT wMsgFilterMax

)

lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
wMsgFilterMin:指定被检索的最小消息值的整数。
wMsgFilterMax:指定被检索的最大消息值的整数。
返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数。

1

2

3

4

5

6

7

BOOL PeekMessage(

LPMSG IpMsg,

HWND hWnd,

UINT wMSGfilterMin,

UINT wMsgFilterMax,

UINT wRemoveMsg

);

lpMsg:接收消息信息的MSG结构指针。
hWnd:其消息被检查的窗口句柄。
wMsgFilterMin:指定被检查的消息范围里的第一个消息。
wMsgFilterMax:指定被检查的消息范围里的最后一个消息。
wRemoveMsg:确定消息如何被处理。此参数可取下列值之一:

阅读剩余部分

相关阅读 >>

win32 sdk基础(五)之关于窗口类的简单介绍

win32 sdk基础(十一)之消息队列和getmessage/peekmessage、sendmessage/postmesage的详解

win32 sdk基础(一)之windows程序分类以及库和头文件所在目录的详解

win32 sdk基础(十三)之键盘和鼠标消息的详细介绍

win32是什么意思?

win32和win64的区别是什么

win32的internet扩展已停止工作怎么解决

win32 sdk基础(十二)之wm_paint消息的处理(图)

win32 sdk基础(三)之如何从零开始创建windows窗口的第一步

win32 sdk基础(六)之详解窗口类的查找过程和相关api

更多相关阅读请进入《win32》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...