如何在没有子类化的情况下挂钩特定的Windows消息?

时间:2010-05-06 11:59:19

标签: c++ windows hook messages

是否可以在不对窗口进行子类化的情况下挂钩特定的Windows消息。

有WH_GETMESSAGE但似乎会产生性能问题。

除此之外的任何其他解决方案都不会降低性能?

1 个答案:

答案 0 :(得分:3)

AFAIK没有比你提到的更好的解决方案。当然,子类化窗口比挂钩线程的所有消息更好。

让我们考虑一下消息在窗口处理之前传递的路径:

  1. 通过显式调用PostMessage / SendMessage或隐式执行操作系统,将消息发布或发送到窗口。
  2. 仅发布消息:最终线程从消息队列中弹出此消息(通过调用GetMessage或类似内容),然后调用DispatchMessage
  3. 操作系统通过调用CallWindowProc(或类似的)来调用窗口的过程。
  4. CallWindowProc标识与窗口关联的窗口过程(通过GetClassLong / GetWindowLong
  5. 调用上述程序。
  6. 子类化 - 表示替换目标窗口的窗口过程。这似乎是最好的变种。 使用WH_GETMESSAGE标志安装挂钩将监视发布到消息队列的所有消息。由于以下原因,这很糟糕:

    1. 表现原因。
    2. 您只会收到针对特定主题
    3. 中创建的窗口的通知
    4. 您只会收到已发布消息的通知(不会看到已发送的消息)
    5. “已发布”消息并不一定意味着“已发布”。也就是说,它可以通过消息循环进行过滤(抛弃而不调用DispatchMessage)。
    6. 您无法看到实际窗口的作用并返回该消息。
    7. 因此,子类化看起来好多了。

      还有一个解决方案 - 如果您的特定邮件已发布(而不是已发送),您可以覆盖邮件循环,并且对于每个检索到的邮件,您可以执行一些前/后处理