值 | 意义 |
---|---|
PM_NOREMOVE | PeekMessage处理后,消息不从队列里除掉。 |
PM_REMOVE | PeekMessage处理后,消息从队列里除掉。 |
PM_NOYIELD | 此标志使系统不释放等待调用程序空闲的线程。可将PM_NOYIELD随意组合到PM_NOREMOVE或PM_REMOVE。 |
GetMessage和PeekMessage的主要区别在于:GetMessage是阻塞函数,它会在消息循环中会一直阻塞直到消息队列中出现了消息可以被获取,而PeekMessage是非阻塞函数,不管有没有获取到消息队列中的消息,它都会返回。PeekMessage更多用来检测消息队里中是否有消息,它的最后一个参数可以用来指定获取到消息后要不要把消息从消息队列中移除,通常情况下通过PeekMessage检测到消息队列有消息之后,再调用GetMessage区获取。
2.3 GetMessage/PeekMessage获取消息的过程
1、先在程序的消息队列中查找消息,如果有队列消息,就取出消息。
2、如果程序的消息队列中没有消息,向系统的消息队列获取属于本程序的消息。如果系统的消息队列中有属于本程序的消息,系统的消息队列会将消息分发到本程序的消息队列中。
3、如果系统的消息队列也没有消息,检查窗口需要绘制的区域是否需要重绘,如果发现有需要重绘的区域,产生WM_PAINT消息。
4、如果没有重新绘制区域,检查是否具有到时的定时器,如果有产生WM_TIMER定时器消息。
5、如果没有到时的定时器,整理程序的资源、内存等等。
三、SendMessage和PostMessage
1 2 3 4 5 6 |
|
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息特定信息。
IParam:指定附加的消息特定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
1 2 3 4 5 6 |
|
hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
HWND_BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、 被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
LParam:指定附加的消息特定的信息。
返回值:如果函数调用成功,返回非零,否则函数调用返回值为零
1、SendMessage
发送消息到指定的窗口,并等候对方将消息处理,为阻塞函数,获取消息的执行结果后返回。主要需要发送非队列消息,发送的消息不经过消息队列。
2、PostMessage
发送消息到程序的消息队列,不管消息有没有被处理都会立即返回,用于队列消息的发送
以上就是Win32 SDK基础(十一)之消息队列和GetMessage/PeekMessage、SendMessage/Postmesage的详解的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
win32 sdk基础(一)之windows程序分类以及库和头文件所在目录的详解
win32 sdk基础(七)之如何创建一个窗口的子窗口的案例
win32 sdk基础(十二)之wm_paint消息的处理(图)
win32 sdk基础(二)之关于cl.exe和link.exe编译和连接程序的详解(图)
win32 sdk基础(八)之 关于windows消息机制的详解(图)
win32 sdk基础(三)之如何从零开始创建windows窗口的第一步
win32 sdk基础(六)之详解窗口类的查找过程和相关api
win32 sdk基础(四)之如何从零开始创建windows窗口的第二步
更多相关阅读请进入《win32》频道 >>