我有一个处理消息的函数,我在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;
}
答案 0 :(得分:9)
消息循环只能看到发布的消息到调用线程的消息队列。但是,WM_SIZE
不是已发布的消息,而是已发送消息。发送的消息直接传递到窗口的消息过程,而根本不通过消息队列(尽管消息循环对发送的消息有一些影响传递到消息程序)。
这就是您的消息循环未看到WM_SIZE
的原因。如果需要,您必须使用SetWindowsLong/Ptr()
或SetWindowsSubclass()
对目标窗口本身进行子类化,以挂钩您自己的窗口过程。
有关详细信息,请参阅MSDN:
答案 1 :(得分:3)
WM_SIZE
直接发送到窗口过程。它不通过消息队列传播。这是很正常的,并且有一大类消息在此同步而不是通过异步消息队列传递。
要拦截此消息,您应将代码放在窗口的窗口过程中。