【问题标题】:Invalid window handle after GetMessage() loopGetMessage() 循环后窗口句柄无效
【发布时间】:2012-01-05 22:38:33
【问题描述】:

由于某种原因,我在 GetMessage() 循环结束后直接收到“无效窗口句柄”错误,但我什至没有将 HWND 传递给它,所以我怎么会收到这个错误? :s

MSG Message;
while(GetMessage(&Message, NULL, 0, 0) != 0)
{
    TranslateMessage(&Message);
    DispatchMessage(&Message);
}
ShowError();

ShowError 没有任何问题,因为我在这个应用程序之外使用它并且没有收到此错误...

void ShowError()
{
    DWORD ErrorCode = GetLastError();
    if(ErrorCode == ERROR_SUCCESS) return;

    LPTSTR lpszBuffer = NULL;
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpszBuffer, 0, NULL);

    MessageBox(NULL, lpszBuffer, NULL, MB_OK | MB_ICONERROR);
    LocalFree(lpszBuffer);
}

【问题讨论】:

    标签: winapi window handle getmessage


    【解决方案1】:

    您只应在 Windows 函数返回失败代码时调用 GetLastError()。这在您的 sn-p 中肯定不是这种情况,您只测试 GetMessage() 返回值是否为 != 0。可能为 0,表示您的程序正常停止 WM_QUIT。或者它可能是 -1,一个真正的错误。

    【讨论】:

      【解决方案2】:

      由于我刚刚遇到同样的错误,这里是我的原因和解决方案。


      原因:您的 WndProc 可能导致此错误。当您关闭窗口时,DefWindowProc 函数会将最后一个错误设置为 1400 = 无效窗口句柄,如果您未“正确”使用 PostQuitMessage。出现此错误时正在处理的消息可能是 WM_NCLBUTTONDOWN。如果窗口已被破坏,则无法处理对其的点击。实际上,您的窗口无法处理一些消息。
      解决方案:PostQuitMessage 之后不再有DefWindowProc!只需返回您的结果代码并退出 WndProc。
      // translated from C#
      LRESULT WndProc(HWND window, int msg, WPARAM wParam, LPARAM lParam)
      {
          if (msg == WM_CLOSE)
          {
              PostQuitMessage(0);
              return 0; // comment this line to get the error again
          }
          return DefWindowProc(window, msg, wParam, lParam);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 2013-09-07
        • 2014-08-02
        • 1970-01-01
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多