getMessage 函数 (winuser.h)
从调用线程的消息队列中检索消息。 函数调度传入的已发送消息,直到已发布的消息可供检索。
GetMessage 函数类似于 PeekMessage,但是, GetMessage 会阻止,直到发布消息后再返回。
语法
BOOL GetMessage(
[out] LPMSG lpMsg,
[in, optional] HWND hWnd,
[in] UINT wMsgFilterMin,
[in] UINT wMsgFilterMax
);
参数
[out] lpMsg
类型: LPMSG
指向 MSG 结构的指针,该结构从线程的消息队列接收消息信息。
[in, optional] hWnd
类型:HWND
要检索其消息的窗口的句柄。 窗口必须属于当前线程。
如果 hWnd 为 NULL,GetMessage 将检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中 hwnd 值为 NULL 的任何消息, () 看到 MSG 结构。 因此,如果 hWnd 为 NULL,则同时处理窗口消息和线程消息。
如果 hWnd 为 -1,则 GetMessage 仅检索当前线程的消息队列中 hwnd 值为 NULL 的消息,即当 hWnd 参数为 NULL) 或 PostThreadMessage 时,PostMessage (发布的线程消息。
[in] wMsgFilterMin
类型: UINT
要检索的最低消息值的整数值。 使用 WM_KEYFIRST (0x0100) 指定第一条键盘消息, 或使用WM_MOUSEFIRST (0x0200) 指定第一条鼠标消息。
在此处和 wMsgFilterMax 中使用WM_INPUT仅指定WM_INPUT消息。
如果 wMsgFilterMin 和 wMsgFilterMax 均为零, 则 GetMessage 将返回所有可用消息 (即不) 执行范围筛选。
[in] wMsgFilterMax
类型: UINT
要检索的最高消息值的整数值。 使用 WM_KEYLAST 指定最后一条键盘消息, WM_MOUSELAST 指定最后一条鼠标消息。
在此处和 wMsgFilterMin 中使用WM_INPUT,仅指定WM_INPUT消息。
如果 wMsgFilterMin 和 wMsgFilterMax 均为零, 则 GetMessage 将返回所有可用消息 (即不) 执行范围筛选。
返回值
类型: BOOL
如果函数检索 WM_QUIT以外的消息,则返回值为非零值。
如果函数检索 WM_QUIT 消息,则返回值为零。
如果出现错误,则返回值为 -1。 例如,如果 hWnd 是无效的窗口句柄或 lpMsg 是无效的指针,则该函数将失败。 要获得更多的错误信息,请调用 GetLastError。
由于返回值可以是非零、零或 -1,因此请避免使用如下所示的代码:
while (GetMessage( lpMsg, hWnd, 0, 0)) ...
如果 hWnd 是无效参数 ((例如引用已销毁) 窗口),则返回值可能为 -1,这意味着此类代码可能会导致严重的应用程序错误。 请改用如下所示的代码:
BOOL bRet;
while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
注解
应用程序通常使用返回值来确定是否结束main消息循环并退出程序。
GetMessage 函数检索与由 hWnd 参数或其任何子级标识的窗口关联的消息(由 IsChild 函数指定),并在 wMsgFilterMin 和 wMsgFilterMax 参数给出的消息值范围内。 请注意,应用程序只能使用 wMsgFilterMin 和 wMsgFilterMax 参数中的低字;高字是为系统保留的。
请注意,无论为 wMsgFilterMin 和 wMsgFilterMax 指定哪些值,GetMessage 始终检索WM_QUIT消息。
在此调用期间,系统将传送挂起的非排队消息,即使用 SendMessage、SendMessageCallback、SendMessageTimeout 或 SendNotifyMessage 函数发送到调用线程拥有的窗口的消息。 然后检索与指定筛选器匹配的第一个排队消息。 系统还可以处理内部事件。 如果未指定筛选器,则按以下顺序处理消息:
若要在发布消息之前检索输入消息,请使用 wMsgFilterMin 和 wMsgFilterMax 参数。GetMessage 不会从队列中删除 WM_PAINT 消息。 消息一直保留在队列中,直到处理。
如果顶级窗口停止响应消息超过几秒钟,系统会认为窗口没有响应,并将其替换为具有相同 z 顺序、位置、大小和视觉属性的虚影窗口。 这允许用户移动它、调整其大小,甚至关闭应用程序。 但是,这些是唯一可用的操作,因为应用程序实际上没有响应。 在调试器模式下,系统不会生成虚影窗口。
DPI 虚拟化
此 API 不参与 DPI 虚拟化。 输出处于消息所面向的窗口的模式。 不考虑调用线程。示例
有关示例,请参阅 创建消息循环。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | winuser.h (包括 Windows.h) |
Library | User32.lib |
DLL | User32.dll |
API 集 | 在 Windows 8) 中引入的 ext-ms-win-ntuser-message-l1-1-0 ( |
请参阅
概念性
引用