winapi全局钩子WM_TIMER跟踪消息发送者

时间:2014-03-08 08:11:54

标签: winapi

我正在尝试使用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

1 个答案:

答案 0 :(得分:2)

您要求查找没有意义的信息。 WM_TIMER消息不会从一个窗口发送到另一个窗口。它是由系统合成的伪消息。

某些低优先级消息以这种方式实现。另一个常见的例子是WM_PAINT。你的程序有一个消息循环,它反复调用GetMessage来从队列中提取消息。当真实消息队列为空时,如果需要,则生成伪消息。此时,系统将合成WM_TIMERWM_PAINT条消息。

因此,这些消息实际上从未发送过。它们只是按需合成。

最重要的是,Windows不会发送消息。通过调用SendMessagePostMessage等来发送消息。这些功能不会要求呼叫者为发送者提供窗口句柄。并且可以从任何地方调用它们,并且与任何发送方窗口都没有明确的关联。因此,即使对于传统真实的消息,发送者窗口的概念也没有意义。