1

有没有办法在不子类化窗口的情况下挂钩特定的 Windows 消息。

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

除了这些不会降低性能的其他解决方案吗?

4

1 回答 1

3

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

让我们考虑一下消息传递的路径,直到它被窗口处理:

  1. 消息要么通过显式调用PostMessage/SendMessage或由操作系统隐式发布或发送到窗口。
  2. 仅发布消息:最终线程从消息队列中弹出此消息(通过调用GetMessage或类似方式),然后调用DispatchMessage.
  3. 操作系统通过调用CallWindowProc(或类似方法)调用窗口的过程。
  4. CallWindowProc标识与窗口关联的窗口过程(通过GetClassLong/ GetWindowLong
  5. 调用上述过程。

子类化 - 意味着替换目标窗口的窗口过程。这似乎是最好的变体。安装带有WH_GETMESSAGE标志的钩子将监视发布到消息队列的所有消息。这很糟糕,原因如下:

  1. 性能原因。
  2. 您只会收到在特定线程中创建的窗口的通知
  3. 您只会收到已发布消息的通知(已发送的消息不会被看到)
  4. “已发布”消息并不一定意味着“已交付”。也就是说,它可能会被消息循环过滤(不调用就丢弃DispatchMessage)。
  5. 您看不到实际窗口对该消息的作用和返回。

因此,子类化似乎要好得多。

另一种解决方案 - 如果您的特定消息被发布(而不是发送),您可以覆盖消息循环,并且对于每条检索到的消息,您可以进行一些预处理/后处理

于 2010-05-06T13:34:06.217 回答