我有一个处理消息的函数,在那里我捕获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;
}发布于 2016-09-06 06:55:20
消息循环只能看到将发布到调用线程的消息队列中的消息。然而,WM_SIZE不是已发布的消息,而是发送的消息。发送的消息直接传递到窗口的消息过程,而根本不遍历消息队列(尽管消息循环对何时将发送的消息传递到消息过程有一定影响)。
这就是为什么您的消息循环没有看到WM_SIZE。如果您需要它,则必须使用SetWindowsLong/Ptr()或SetWindowsSubclass()将目标窗口本身子类化,以挂钩您自己的窗口过程。
有关详细信息,请参阅MSDN:
发布于 2016-09-06 06:54:31
WM_SIZE直接发送到窗口过程。它不会通过消息队列传播。这是非常正常的,其中有一大类消息是以同步方式而不是通过异步消息队列传递的。
若要拦截此消息,应将代码放在窗口的窗口过程中。
https://stackoverflow.com/questions/39342292
复制相似问题