我正在尝试将消息从全局 WindowProc 函数发送到 GUI 类。消息定义如下:
#define WM_ENV_RESIZED (WM_APP + 0)
我的 WindowProc 函数看起来像这样
LRESULT CALLBACK windowProcedure(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int res;
switch (message)
{
case WM_SIZE:
std::cout << "window resized" << std::endl;
res = PostMessage(hWnd, WM_ENV_RESIZED, 0, 0);
if ( res == 0 ) //<-- res is never 0
{
std::cout << "PostMessage failure!" << std::endl;
std::cout << "Error code: " << GetLastError() << std::endl;
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
然后在 GUI 类中接收到消息,如下所示:
MSG msg;
while (running)
{
while ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
processWindowsMessage(&msg);
//DirectX render calls
}
现在我的问题是 PeekMessage() 从未收到该消息。它仅在创建窗口时收到一次。之后就再也没有收到了。
在 PostMessage() 之后直接调用 GetLastError() 总是返回错误代码 6,根据MSDN ,它代表 ERROR_INVALID_HANDLE 。但这没有任何意义,因为 PostMessage() 永远不会返回 0,这意味着在发布过程中出现了问题。我尝试绕过消息队列并使用 SendMessage() 将消息直接发送到窗口,但始终返回 0(具有相同的错误代码 6..)。
我真的不知道我做错了什么。使用 PeekMessage() 时,如何确保始终收到已发布的消息?
编辑: 我已经按照 Remy 的建议更新了消息循环。下面是 processWindowsMessage() 中的代码
void Environment::processWindowsMessage( MSG *msg )
{
switch ( msg->message )
{
case WM_ENV_RESIZED:
std::cout << "WM_ENV_RESIZED caught" << std::endl;
break;
case WM_QUIT:
running = false;
break;
default:
TranslateMessage(msg);
DispatchMessage(msg);
break;
}
}