【发布时间】:2016-04-21 09:30:17
【问题描述】:
我猜它以某种方式接收到 WM_QUIT 消息,因为这就是 while 循环所围绕的内容(根据 proc 函数,每当处理 WM_DESTROY 消息时就会发生)
每当我使用 PeekMessage 而不是 GetMessage 时,窗口都会自动关闭,我使用 PeekMessage 以最大速度运行循环
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
if(!CreateMainWindow(hinstance, nCmdShow))
return false;
//this works
while (GetMessage(&msg, (HWND) NULL, 0 , 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
UNREFERENCED_PARAMETER(lpCmdLine);
}
//this automatically closes the window
int done = 0;
while (!done)
{
if (PeekMessage (&msg, NULL, 0 ,0, PM_REMOVE))
{
if (msg.message = WM_QUIT)
done = 1;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
UNREFERENCED_PARAMETER(lpCmdLine);
这是简单的 WinProc 函数
LRESULT CALLBACK WinProc ( HWND hWnd, UINT msg, WPARAM wParam, LPARAM
lParam)
{
switch( msg)
{
Case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc ( hWnd, msg, wParam, lParam);
}
【问题讨论】:
-
我回滚了您上次的编辑,因为您用答案覆盖了问题。没有问题的两个答案对未来的访问者没有帮助。由于您还没有这样做,请考虑使用tour。
-
if (msg.message == WM_QUIT)
-
"我使用 PeekMessage 以最大速度运行循环" - 是什么让您认为在循环中调用
PeekMessage()比在循环中调用GetMessage()更快循环? -
@Remy Lebeau PeekMessage() 比 GetMessage() 快,因为 GetMessage() 在返回之前等待消息
-
@hec:这并不意味着什么。在您显示的代码中,在没有要处理的消息的情况下在不做任何其他事情的繁忙循环中调用
PeekMessage()只会无休止地固定 CPU 并且没有任何好处。至少GetMessage()将使调用线程休眠,直到有新消息到达。