首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WINAPI GetMessage HWND

WINAPI GetMessage HWND
EN

Stack Overflow用户
提问于 2014-04-26 11:22:08
回答 1查看 5.1K关注 0票数 2

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

代码语言:javascript
复制
GetMessage(&message, NULL, 0, 0);

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

以下是完整的代码:

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

发布于 2014-04-26 11:44:29

“.当我试图更改第二个参数(hwnd),它将接收到我以前创建的窗口的消息时,它无法工作。”

线程消息不被发送到窗口;它们被发布到带有空窗口句柄的线程消息队列中,并且不会使用针对特定窗口句柄的GetMessage()循环来捕获。

例:PostQuitMessage()发布线程消息,而不是窗口消息。你需要空值。来自GetMessage()文档:

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23310136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档