我试图从一个全局的WindowProc函数发送一个消息给一个GUI类。 该消息被定义如下:PostMessage只能使用一次?
#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;
}
}
如果'PostMessage'说它成功了,那么它成功了。在这种情况下调用'GetLastError'没有用处,因为错误代码只在失败时定义。某些API函数预期设置错误代码,*以防*出现错误。除非文档建议你,否则不要调用'GetLastError'。文档通常只在失败时提供建议。成功的原因很少见。 –
你可以发布你的processWindowsMessage函数的相关部分吗? –
PostMessage调用中使用的窗口句柄没有意义。它当然不应该是hWnd。 –