【问题标题】:winapi global hook WM_TIMER trace message senderwinapi 全局挂钩 WM_TIMER 跟踪消息发送者
【发布时间】:2014-04-01 00:52:01
【问题描述】:

我正在尝试使用WH_GETMESSAGE 挂钩监视另一个窗口句柄(特别是WM_TIMER)发送的消息,但似乎我只能获取接收者句柄,而不是发送者。这是我的代码:

    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

【问题讨论】:

  • How can my app find the sender of a windows message? 的可能重复项 - 如果您查看该问题,您会发现这是不可能的。我是previously asking a similar question。对于 WM_TIMER 虽然它更复杂,因为这是一条伪消息,而不是“真实”消息。
  • 我不明白。当我使用 Spy++ 时,它确实显示该消息是从该句柄窗口发布的,这意味着 Spy++ 以某种方式捕获了该消息。真是头疼……
  • WM_TIMER 不是已发送的消息。没有发件人。 Spy++ 显示的是收件人而不是发件人。

标签: winapi


【解决方案1】:

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

某些低优先级消息以这种方式实现。另一个常见的例子是WM_PAINT。您的程序有一个重复调用GetMessage 的消息循环,它将消息从队列中拉出。当真实消息队列为空时,根据需要生成伪消息。此时系统将合成WM_TIMERWM_PAINT消息。

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

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

【讨论】:

  • 实际上,我依靠这条消息来触发我的注入代码,因为它最接近我正在监视的事件。我想我得另寻他法了。非常感谢!
  • 通过 RegisterWindowMessage() 使用自定义消息,并使用 PostMessage() 或 PostThreadMessage() 将其发布到目标窗口/线程的消息队列。
猜你喜欢
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多