本帖最后由 LLJ 于 2020-4-30 16:49 编辑
声明
参量
消息指针
指向MSG结构的指针,该结构从线程的消息队列接收消息信息。
窗口句柄
要获取其消息的窗口的句柄。该窗口必须属于当前线程。
如果窗口句柄为NULL,则GetMessage检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中窗口句柄值为NULL的消息(请参阅MSG结构)。因此,如果窗口句柄为NULL,则将同时处理窗口消息和线程消息。
如果窗口句柄为-1,则GetMessage仅检索当前线程的消息队列中其窗口句柄值为NULL的消息,即,由PostMessage(当窗口句柄参数为NULL)或PostThreadMessage发布的线程消息 。
过滤最小消息
要检索的最低消息值的整数值。使用WM_KEYFIRST(0x0100)指定第一条键盘消息,或使用WM_MOUSEFIRST(0x0200)指定第一条鼠标消息。
在此处以及在过滤最大消息中使用WM_INPUT仅指定WM_INPUT消息。
如果过滤最小消息和过滤最大消息均为零,则GetMessage返回所有可用消息(即,不执行范围过滤)。
过滤最大消息
要检索的最高消息值的整数值。使用WM_KEYLAST指定最后的键盘消息,或使用WM_MOUSELAST指定最后的鼠标消息。
在此处以及在过滤最小消息中使用WM_INPUT仅指定WM_INPUT消息。
如果过滤最小消息和过滤最大消息均为零,则GetMessage返回所有可用消息(即,不执行范围过滤)。
返回值
如果函数检索到WM_QUIT以外的消息,则返回值为非零。
如果该函数检索WM_QUIT消息,则返回值为零。
如果有错误,则返回值为-1。例如,如果窗口句柄是无效的窗口句柄或消息指针是无效的指针,则该函数将失败。要获取扩展的错误信息,请调用GetLastError。
因为返回值可以是非零,零或-1,所以请避免使用以下代码:
如果窗口句柄是无效参数(例如,引用已经被销毁的窗口),则返回值-1的可能性意味着这种代码可能导致致命的应用程序错误。而是使用如下代码:
备注
应用程序通常使用返回值来确定是否结束主消息循环并退出程序。
所述的GetMessage与由标识的窗口相关联的功能检索消息的窗口句柄参数或其任何儿童,由指定IsChild功能,并且通过给定的消息的值的范围内过滤最小消息和过滤最大消息参数。请注意,应用程序只能在过滤最小消息和过滤最大消息参数中使用低位字。高位字是为系统保留的。
请注意,无论您为过滤最小消息和过滤最大消息指定哪个值,GetMessage始终会检索WM_QUIT消息。
在此调用期间,系统使用SendMessage,SendMessageCallback,SendMessageTimeout或SendNotifyMessage函数传递未决的未排队消息,即发送到调用线程拥有的窗口的消息。然后,检索与指定过滤器匹配的第一条排队消息。系统还可以处理内部事件。如果未指定过滤器,则按以下顺序处理消息:
- 发送消息
- 投递消息
- 输入(硬件)消息和系统内部事件
- 发送消息(再次)
- WM_PAINT消息
- WM_TIMER消息
要在发布消息之前检索输入消息,请使用过滤最小消息和过滤最大消息参数。
GetMessage不会从队列中删除WM_PAINT消息。消息将保留在队列中,直到被处理。
如果顶级窗口停止响应消息超过几秒钟,则系统认为该窗口没有响应,并用具有相同z顺序,位置,大小和视觉属性的幻影窗口替换它。这使用户可以移动它,调整大小,甚至关闭应用程序。但是,这些是唯一可用的操作,因为应用程序实际上没有响应。在调试器模式下,系统不会生成幻影窗口。
参考
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmessagea
|