Win32并在WindowProcedure之外捕获WM_SIZE消息

Mik*_*nen 4 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;
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 9

消息循环只能看到发布到调用线程的消息队列的消息. WM_SIZE但是,它不是已发布的消息,而是已发送的消息.发送的消息直接传递到窗口的消息过程,而根本不经过消息队列(尽管消息循环对发送的消息何时传递给消息过程有一些影响).

这就是你的消息循环没有看到的原因WM_SIZE.如果需要,您必须使用SetWindowsLong/Ptr()SetWindowsSubclass()在您自己的窗口过程中挂钩目标窗口本身.

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

消息和消息队列

子类控件

  • 如果窗口是由程序定义的,那么就不需要子类化或挂钩,代码可以放在窗口过程中. (2认同)