WINAPI GetMessage HWND

Я работаю над созданием окна с помощью 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);
}

person user3407319    schedule 26.04.2014    source источник
comment
Я заметил только пару вещей: while (GetMessage(&message, NULL, 0, 0)) обычно равно while (GetMessage(&message, NULL, 0, 0) > 0), поэтому вы можете правильно фильтровать сообщения. Кроме того, вместо return 1 вам, как правило, нужно return message.wParam - правильное завершение работы приложения обычно возвращает 0, как и ваш вызов PostQuitMessage(0), а затем возврат message.wParam правильно передаст это, в то время как PostQuitMessage(1) вернет 1, сообщая об аварийном завершении работы. Однако ваш код, похоже, работает для меня.   -  person cf stands with Monica    schedule 26.04.2014
comment
Преднамеренное отсутствие передачи NULL — это просто ошибка.   -  person Hans Passant    schedule 26.04.2014
comment
@ХансПассант +1. почти в каждом случае, который я видел, это действительно так.   -  person WhozCraig    schedule 26.04.2014


Ответы (1)


«... когда я пытаюсь изменить второй параметр (hwnd), который будет получать сообщения в окно, которое я ранее создал, это не работает».

Сообщения потока не отправляются в окно; они отправляются в очередь сообщений потока с дескриптором окна NULL и НЕ будут выбраны с помощью цикла GetMessage(), адаптированного к конкретному дескриптору окна.

Пример: PostQuitMessage() публикует сообщение в треде; не оконное сообщение. Вам нужен НУЛЬ. Из GetMessage() документы:

Если hWnd имеет значение NULL, GetMessage извлекает сообщения для любого окна, принадлежащего текущему потоку, и любые сообщения в очереди сообщений текущего потока, значение hwnd которых равно NULL (см. структуру MSG). Следовательно, если hWnd имеет значение NULL, обрабатываются как оконные сообщения , так и сообщения потоков.

person WhozCraig    schedule 26.04.2014