PeekMessage

来源:互联网 发布:淘宝如何推广引流 编辑:程序博客网 时间:2024/06/05 18:26

调度传入的发送消息,检查发送消息的线程消息队列,并检索消息(如果有的话)。

BOOL WINAPI PeekMessage(  _Out_ LPMSG lpMsg,  _In_opt_ HWND hWnd,  _In_ UINT wMsgFilterMin,  _In_ UINT wMsgFilterMax,  _In_ UINT wRemoveMsg);

参数
lpMsg [out]
类型:LPMSG
指向接收消息信息的MSG结构的指针。


hWnd [in,可选]
类型:HWND
要检索其消息的窗口的句柄。该窗口必须属于当前线程。
如果hWnd为NULL,PeekMessage将检索属于当前线程的任何窗口的消息,以及hwnd值为NULL的当前线程的消息队列中的任何消息(请参阅MSG结构)。因此,如果hWnd为NULL,则处理窗口消息和线程消息。
如果hWnd为-1,PeekMessage仅检索当前线程的消息队列中的消息,其中hwnd值为NULL,即PostMessage(hWnd参数为NULL)或PostThreadMessage发布的线程消息 。


wMsgFilterMin [in]
类型:UINT
要检查的消息范围内的第一条消息的值。使用WM_KEYFIRST(0x0100)指定第一个键盘消息或WM_MOUSEFIRST(0x0200)来指定第一个鼠标消息。
如果wMsgFilterMin和wMsgFilterMax都为零,PeekMessage返回所有可用的消息(即不执行范围过滤)。


wMsgFilterMax [in]
类型:UINT
要检查的消息范围内的最后一条消息的值。使用WM_KEYLAST指定最后一个键盘消息或WM_MOUSELAST来指定最后一个鼠标消息。
如果wMsgFilterMin和wMsgFilterMax都为零,PeekMessage返回所有可用的消息(即不执行范围过滤)。


wRemoveMsg [in]
类型:UINT
指定消息的处理方式。此参数可以是以下值中的一个或多个。

值含义
PM_NOREMOVE
为0x0000

PeekMessage处理后消息不会从队列中删除。

PM_REMOVE
0×0001

PeekMessage处理后消息将从队列中删除。

PM_NOYIELD
0×0002

防止系统释放等待呼叫者空闲的任何线程(请参阅WaitForInputIdle)。

将此值与PM_NOREMOVEPM_REMOVE组合

 默认情况下,处理所有消息类型。要指定只处理某些消息,请指定以下一个或多个值。

值含义
PM_QS_INPUT
(QS_INPUT << 16)

处理鼠标和键盘消息。

PM_QS_PAINT
(QS_PAINT << 16)

处理油漆消息。

PM_QS_POSTMESSAGE
((QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER)<< 16)

处理所有发布的消息,包括计时器和热键。

PM_QS_SENDMESSAGE
(QS_SENDMESSAGE << 16)

处理所有发送的消息。

 返回值
类型:BOOL
如果消息可用,则返回值不为零。
如果没有可用的消息,返回值为零。


备注
的PeekMessage检索与由所述标识的窗口相关联的消息的hWnd由指定的参数或任何其子的IsChild功能,并且通过给定的消息的值的范围内wMsgFilterMin和wMsgFilterMax参数。
请注意,应用程序只能使用wMsgFilterMin和wMsgFilterMax参数中的低字; 高字保留给系统。


请注意,PeekMessage始终检索WM_QUIT消息,无论您为wMsgFilterMin和wMsgFilterMax指定了哪些值。


在此呼叫期间,系统提供待处理的非排队消息,即使用SendMessage,SendMessageCallback,SendMessageTimeout或SendNotifyMessage函数发送到调用线程拥有的窗口的消息。


然后检索与指定的过滤器匹配的第一个排队的消息。该系统还可以处理内部事件。如果未指定过滤器,则按以下顺序处理消息:

  • 发送信息
  • 发布消息
  • 输入(硬件)消息和系统内部事件
  • 发消息(再次)
  • WM_PAINT消息
  • WM_TIMER消息

要在发布消息之前检索输入消息,请使用wMsgFilterMin和wMsgFilterMax参数。
所述的PeekMessage功能通常不会删除WM_PAINT从队列中的消息。WM_PAINT消息保留在队列中,直到它们被处理。但是,如果WM_PAINT消息具有NULL更新区域,PeekMessage将其从队列中删除。
如果顶级窗口停止响应消息超过几秒钟,系统会将该窗口视为不响应,并使用具有相同z阶,位置,大小和视觉属性的ghost窗口替换该窗口。这允许用户移动它,调整大小,甚至关闭应用程序。
但是,这些是唯一可用的操作,因为应用程序实际上没有响应。当一个应用程序被调试时,系统不会生成一个鬼窗口。