WINAPI GetMessage HWND

时间:2014-04-26 11:22:09

标签: c++ winapi hwnd window-messages

我正在使用Win32 API创建窗口,我遇到了这个部分的问题:

GetMessage(&message, NULL, 0, 0);

我的问题是,当我尝试更改第二个参数(hwnd)时,它会将消息接收到我之前创建的窗口,但它不起作用;例如,当我尝试关闭窗口时,它只隐藏并且不关闭。

以下是完整代码:

#include <windows.h>

LRESULT CALLBACK WinProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
  WNDCLASS window;
  window.cbClsExtra = NULL;
  window.cbWndExtra = NULL;
  window.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
  window.hCursor = LoadCursor(hInst, IDC_ARROW);
  window.hIcon = NULL;
  window.hInstance = hInst;
  window.lpfnWndProc = WinProc;
  window.lpszClassName = "WINDOW";
  window.lpszMenuName = NULL;
  window.style = CS_HREDRAW | CS_VREDRAW;

  RegisterClass(&window);

  HWND hwnd = CreateWindow("WINDOW", "Win32 Window Application", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, NULL, hInst, NULL);

  ShowWindow(hwnd, SW_SHOW);
  UpdateWindow(hwnd);

  MSG message;

  while (GetMessage(&message, NULL, 0, 0))
  {
    TranslateMessage(&message);
    DispatchMessage(&message);
  }

  return 1;
}

LRESULT CALLBACK WinProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {
  case WM_CLOSE:
    {
      PostQuitMessage(0);
      break;
    }

  default:
    break;
  }

  return DefWindowProc(window, message, wParam, lParam);
}

1 个答案:

答案 0 :(得分:6)

“...当我尝试更改第二个参数(hwnd),它将接收消息到我之前创建的窗口时,它不起作用。”

线程消息不会发送到窗口;它们被发布到具有NULL窗口句柄的线程消息队列中,并且不会被定制为特定窗口句柄的GetMessage()循环拾取。

例如:PostQuitMessage()发布帖子消息;不是窗口消息。你需要NULL。来自GetMessage()文档:

  

如果hWnd为NULL,则GetMessage将检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中hwnd值为NULL的任何消息(请参阅MSG结构)。因此,如果hWnd为NULL,则处理窗口消息和线程消息