GetMessageA 函数 (winuser.h)

从调用线程的消息队列中检索消息。 该函数调度传入的已发送消息,直到发布的消息可供检索。

与 getMessage 不同,PeekMessage 函数不会等待在返回之前发布消息。

语法

BOOL GetMessageA(
  [out]          LPMSG lpMsg,
  [in, optional] HWND  hWnd,
  [in]           UINT  wMsgFilterMin,
  [in]           UINT  wMsgFilterMax
);

参数

[out] lpMsg

类型:LPMSG

指向从线程的消息队列接收消息信息的 MSG 结构的指针。

[in, optional] hWnd

类型:HWND

要检索其消息的窗口的句柄。 窗口必须属于当前线程。

如果 hWndNULL,则 GetMessage 检索属于当前线程的任何窗口的消息,以及当前线程的消息队列上 hwndNULL 的任何消息(请参阅 MSG 结构)。 因此,如果 hWnd NULL,则会处理窗口消息和线程消息。

如果 hWnd 为 -1,GetMessage 仅检索当前线程的消息队列中的消息,其 hwnd值为 null,即 PostMessage 发布的线程消息(当 hWnd 参数 NULL时)或 PostThreadMessage

[in] wMsgFilterMin

类型:UINT

要检索的最低消息值的整数值。 使用 WM_KEYFIRST(0x0100)指定第一条键盘消息或 WM_MOUSEFIRST(0x0200)来指定第一条鼠标消息。

在此处和 wMsgFilterMax 中使用 WM_INPUT 来仅指定 WM_INPUT 消息。

如果 wMsgFilterMinwMsgFilterMax 均为零,GetMessage 将返回所有可用消息(即,不执行范围筛选)。

[in] wMsgFilterMax

类型:UINT

要检索的最高消息值的整数值。 使用 WM_KEYLAST 指定最后一条键盘消息或 WM_MOUSELAST 指定最后一条鼠标消息。

在此处和 wMsgFilterMin 中使用 WM_INPUT 来仅指定 WM_INPUT 消息。

如果 wMsgFilterMinwMsgFilterMax 均为零,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); 
    }
}

言论

应用程序通常使用返回值来确定是否结束主消息循环并退出程序。

GetMessage 函数检索与由 hWnd 参数或其任何子项标识的消息(由 IsChild 函数指定)以及由 wMsgFilterMinwMsgFilterMax 参数提供的消息值范围内。 请注意,应用程序只能在 wMsgFilterMin 中使用低字,wMsgFilterMax 参数;为系统保留高字。

请注意,GetMessage 始终检索 WM_QUIT 消息,无论为 wMsgFilterMin 指定哪些值,wMsgFilterMax

在此调用期间,系统会传递挂起的非排队消息,即使用 sendMessageSendMessage发送到调用线程拥有的消息、SendMessageCallbackSendMessageTimeoutSendNotifyMessage 函数。 然后检索与指定筛选器匹配的第一个排队消息。 系统还可以处理内部事件。 如果未指定筛选器,则按以下顺序处理消息:

  • 已发送邮件
  • 已发布的消息
  • 输入(硬件)消息和系统内部事件
  • 已发送邮件(再次)
  • WM_PAINT 消息
  • WM_TIMER 消息
若要在发布的消息之前检索输入消息,请使用 wMsgFilterMinwMsgFilterMax 参数。

GetMessage 不会从队列中删除 WM_PAINT 消息。 消息将保留在队列中,直到处理完毕。

如果顶级窗口停止响应消息数秒以上,系统将窗口视为不响应,并将其替换为具有相同 z 顺序、位置、大小和视觉属性的虚影窗口。 这样,用户就可以移动它、调整大小,甚至关闭应用程序。 但是,这些操作是唯一可用的操作,因为应用程序实际上没有响应。 在调试器模式下时,系统不会生成虚影窗口。

DPI 虚拟化

此 API 不参与 DPI 虚拟化。 输出处于消息所面向窗口的模式。 不考虑调用线程。

例子

有关示例,请参阅 创建消息循环

注意

winuser.h 标头将 GetMessage 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows 2000 Professional [仅限桌面应用]
支持的最低服务器 Windows 2000 Server [仅限桌面应用]
目标平台 窗户
标头 winuser.h (包括 Windows.h)
User32.lib
DLL User32.dll
API 集 ext-ms-win-ntuser-message-l1-1-0(在 Windows 8 中引入)

另请参阅

概念

IsChild

MSG

消息和消息队列

PeekMessage

PostMessage

PostThreadMessage

参考

WaitMessage