c++ - Win32 并在 WindowProcedure 外捕获 WM_SIZE 消息

标签 c++ winapi

我有一个处理消息的函数,我在 WindowProcedure 之外捕获某些消息以触发所需的行为。

问题是,虽然其他消息似乎正在按需要工作,但出于某种原因我无法捕获 WM_SIZE 消息。 WM_SIZE 出现在 WindowProcedure 中,但我找不到我的函数看不到它的原因。 我读取当前HWND的方法有问题吗?

目前的功能是:

// OS MESSAGES
int OSMessages(void)
{
  MSG msg;
  HWND actwnd = GetActiveWindow();

  if ( PeekMessage(&msg, actwnd, 0, 0, PM_REMOVE) )
  {

    if (msg.message == WM_QUIT)
    {
      printf("QUIT");
      return -1;
    }
    else if (msg.message == WM_SIZE)
    {
      printf("RESIZE");
      return 1;
    }

    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }

  return 0;
}

最佳答案

消息循环只能看到发布到调用线程的消息队列的消息。但是,WM_SIZE 不是已发布的消息,而是已发送 的消息。已发送的消息直接传递到窗口的消息过程,根本不经过消息队列(尽管消息循环对何时将已发送的消息传递到消息程序)。

这就是为什么您的消息循环看不到 WM_SIZE 的原因。如果需要,您必须使用 SetWindowsLong/Ptr() 对目标窗口本身进行子类化。或 SetWindowsSubclass() Hook 您自己的窗口过程。

有关详细信息,请参阅 MSDN:

Messages and Message Queues

Subclassing Controls

关于c++ - Win32 并在 WindowProcedure 外捕获 WM_SIZE 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39342292/

相关文章:

c++ - TBB concurrent_queue 使用示例

c++ - 重命名 objective-c 目录中的多个文件

c - Accept call 不会阻塞第二次(或不止一次)?

c++ - 如何逐步遍历目录树?

c++ - 检查文件是否被进程文件句柄锁定

c++ - 编译时无法打开包含文件 X11/X.h

c++ - 将 C 字符串和 vector 发送到 MurmurHash 会产生不一致的结果

c++ - 使用模板与函数的好处以及如何推断模板中的类型

c - CryptGenRandom() 是线程安全的吗?

c++ - SMTP 身份验证 QT/C++