我正在尝试使用WM_TIMER
挂钩监视另一个窗口句柄(特别是WH_GETMESSAGE
)发送的消息,但似乎我只能得到接收者句柄,而不是发送者。这是我的代码:
LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam){
if (nCode < 0){
return CallNextHookEx(hGetMsgHook, nCode, wParam, lParam);
}
else{
MSG* msg = (MSG*)lParam;
HWND window = msg->hwnd;
unsigned int msgCode=LOWORD(msg->message);
char* className = new char[50];
if (msgCode == WM_TIMER){
GetClassNameA(window, className, 50);
//className of the receiver handle
}
}
return CallNextHookEx(hGetMsgHook, nCode, wParam, lParam);
}
如何获取发件人hwnd
?
答案 0 :(得分:2)
您要求查找没有意义的信息。 WM_TIMER
消息不会从一个窗口发送到另一个窗口。它是由系统合成的伪消息。
某些低优先级消息以这种方式实现。另一个常见的例子是WM_PAINT
。你的程序有一个消息循环,它反复调用GetMessage
来从队列中提取消息。当真实消息队列为空时,如果需要,则生成伪消息。此时,系统将合成WM_TIMER
或WM_PAINT
条消息。
因此,这些消息实际上从未发送过。它们只是按需合成。
最重要的是,Windows不会发送消息。通过调用SendMessage
,PostMessage
等来发送消息。这些功能不会要求呼叫者为发送者提供窗口句柄。并且可以从任何地方调用它们,并且与任何发送方窗口都没有明确的关联。因此,即使对于传统真实的消息,发送者窗口的概念也没有意义。