2

私は Win32 API でウィンドウの作成に取り組んでいますが、この部分に問題があります:

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

私の問題は、hwnd以前に作成したウィンドウへのメッセージを受信する 2 番目のパラメーター ( ) を変更しようとすると、機能しないことです。たとえば、ウィンドウを閉じようとすると、非表示になるだけで閉じません。

完全なコードは次のとおりです。

#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);
}
4

1 に答える 1

6

「... 以前に作成したウィンドウにメッセージを受信する 2 番目のパラメーター (hwnd) を変更しようとすると、機能しません。」

スレッド メッセージはウィンドウに送信されません。GetMessage()それらは NULL ウィンドウ ハンドルでスレッド メッセージ キューにポストされ、特定のウィンドウ ハンドルに合わせたループでピックアップされません。

例:スレッドメッセージPostQuitMessage()を投稿します。ウィンドウメッセージではありません。NULL が必要です。ドキュメントから:GetMessage()

hWnd が NULL の場合、GetMessage は、現在のスレッドに属するウィンドウのメッセージと、現在のスレッドのメッセージ キューにある hwnd 値が NULL のメッセージを取得します (MSG 構造体を参照してください)。したがって、hWnd が NULL の場合、ウィンドウ メッセージとスレッド メッセージの両方が処理されます。

于 2014-04-26T11:44:29.673 に答える