【问题标题】:why am i unable to create a successful message loop with PeekMessage()?为什么我无法使用 PeekMessage() 创建成功的消息循环?
【发布时间】: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() 将使调用线程休眠,直到有新消息到达。

标签: loops winapi message


【解决方案1】:

您将 WM_QUIT 分配给 msg.message 而不是比较它。

【讨论】:

  • 这就是为什么你应该总是在编译时启用警告。
  • ...或者不要忽略警告!这也是为什么有时建议进行比较的原因是:“if (WM_QUIT == msg.message)”。如果您不小心忘记并将比较编码为赋值(== as =),那么编译器将发出错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2021-05-14
相关资源
最近更新 更多