首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Win32和在WindowProcedure之外捕获WM_SIZE消息

Win32和在WindowProcedure之外捕获WM_SIZE消息
EN

Stack Overflow用户
提问于 2016-09-06 06:49:15
回答 2查看 1.7K关注 0票数 4

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

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

目前的职能是:

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-06 06:55:20

消息循环只能看到发布到调用线程的消息队列中的消息。然而,WM_SIZE不是已发布的消息,而是发送的消息。发送的消息直接传递到窗口的消息过程,而根本不遍历消息队列(尽管消息循环对何时将发送的消息传递到消息过程有一定影响)。

这就是为什么您的消息循环没有看到WM_SIZE。如果您需要它,则必须使用SetWindowsLong/Ptr()SetWindowsSubclass()将目标窗口本身子类化,以挂钩您自己的窗口过程。

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

消息和消息队列

子类控件

票数 9
EN

Stack Overflow用户

发布于 2016-09-06 06:54:31

WM_SIZE直接发送到窗口过程。它不会通过消息队列传播。这是非常正常的,其中有一大类消息是以同步方式而不是通过异步消息队列传递的。

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

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

https://stackoverflow.com/questions/39342292

复制
相关文章

相似问题

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