有没有办法在不子类化窗口的情况下挂钩特定的 Windows 消息。
有 WH_GETMESSAGE 但这似乎会产生性能问题。
除了这些不会降低性能的其他解决方案吗?
AFAIK 没有比您提到的更好的解决方案。而且,当然,子类化窗口比挂钩线程的所有消息要好。
让我们考虑一下消息传递的路径,直到它被窗口处理:
PostMessage
/SendMessage
或由操作系统隐式发布或发送到窗口。GetMessage
或类似方式),然后调用DispatchMessage
.CallWindowProc
(或类似方法)调用窗口的过程。CallWindowProc
标识与窗口关联的窗口过程(通过GetClassLong
/ GetWindowLong
)子类化 - 意味着替换目标窗口的窗口过程。这似乎是最好的变体。安装带有WH_GETMESSAGE
标志的钩子将监视发布到消息队列的所有消息。这很糟糕,原因如下:
DispatchMessage
)。因此,子类化似乎要好得多。
另一种解决方案 - 如果您的特定消息被发布(而不是发送),您可以覆盖消息循环,并且对于每条检索到的消息,您可以进行一些预处理/后处理