PeekMessage使用方法
来源:互联网 发布:存货管理的数据 编辑:程序博客网 时间:2024/06/03 19:43
原型:
BOOL PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg);
前面的四个参数(一个指向MSG结构的指标、一个视窗代号、两个值指示消息范围)与GetMessage的参数相同。将第二、三、四个参数设定为NULL或0时,表明我们想让PeekMessage传回程式中所有视窗的所有消息。如果要将消息从消息伫列中删除,则将PeekMessage的最後一个参数设定为PM_REMOVE。如果您不希望删除消息,那么您可以将这个参数设定为PM_NOREMOVE。这就是为什么Peek_Message是「偷看」而不是「取得」的原因,它使得程式可以检查程式的伫列中的下一个消息,而不实际删除它。
GetMessage不将控制传回给程式,直到从程式的消息伫列中取得消息,但是PeekMessage总是立刻传回,而不论一个消息是否出现。当消息伫列中有一个消息时,PeekMessage的传回值为TRUE(非0),并且将按通常方式处理消息。当伫列中没有消息时,PeekMessage传回FALSE(0)。这使得我们可以改写普通的消息循环。我们可以将如下所示的消息循环:
while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ;
替换为如下消息循环:
while (TRUE) { if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) break ; TranslateMessage (&msg) ; DispatchMessage (&msg) ; } else { // 完成某些工作的其他行程式 } } return msg.wParam ;
如果PeekMessage的传回值为TRUE,则消息按通常方式进行处理。如果传回值为FALSE,则在将控制传回给Windows之前,还可以作一点工作(如显示另一个随机矩形)。(尽管Windows 文件上说,您不能用PeekMessage 从消息伫列中删除WM_PAINT消息,但是这并不是什么大不了的问题。毕竟,GetMessage并不从消息伫列中删除WM_PAINT消息。从伫列中删除WM_PAINT消息的唯一方法是令视窗显示区域的失效区域变得有效,这可以用ValidateRect和ValidateRgn或者BeginPaint和EndPaint对来完成。如果您在使用PeekMessage从伫列中取出WM_PAINT消息後,同平常一样处理它,那么就不会有问题了。所不能作的是使用如下所示的程式码来清除消息伫列中的所有消息:
while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) ;
这行叙述从消息伫列中删除WM_PAINT之外的所有消息。如果伫列中有一个WM_PAINT消息,程式就会永远地陷在while循环中。*
- PeekMessage使用方法
- PeekMessage使用方法
- PeekMessage
- PeekMessage
- peekmessage
- PeekMessage
- PeekMessage()
- PeekMessage
- PeekMessage
- PeekMessage
- PeekMessage
- PeekMessage
- peekmessage函数
- peekmessage getmessage
- GetMessage PeekMessage
- peekmessage getmessage
- PeekMessage 详解
- PeekMessage & GetMessage
- hdu 3661 Assignments【贪心】
- wget常用命令
- 有帮助的文章,代码!
- 逐梦C++补遗篇之三:若干重要C++特性
- windbg的x命令
- PeekMessage使用方法
- 【POI2014】【BZOJ3831】Little Bird
- 你了解净水器滤芯知识多少?
- 正则表达式情景积累
- 筛法求素数
- org.hibernate.QueryException: could not resolve property:xxxxxid 外键查询 hibernate
- Mysql支持的数据类型(总结)
- PEP8 Python编码规范
- 排序六之快速排序