Win32并在WindowProcedure

时间:2016-09-06 06:49:15

标签: c++ winapi

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

问题在于,虽然其他消息似乎正在按需工作,但由于某种原因我无法捕获WM_SIZE消息。 在WindowProcedure中可以看到WM_SIZE,但我无法找到为什么我的函数看不到它的原因。 我的方法是否存在读取当前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;
}

2 个答案:

答案 0 :(得分:9)

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

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

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

Messages and Message Queues

Subclassing Controls

答案 1 :(得分:3)

WM_SIZE直接发送到窗口过程。它不通过消息队列传播。这是很正常的,并且有一大类消息在此同步而不是通过异步消息队列传递。

要拦截此消息,您应将代码放在窗口的窗口过程中。