【问题标题】:How to intercept a window message in a shell extension如何在 shell 扩展中拦截窗口消息
【发布时间】:2015-01-03 05:24:10
【问题描述】:

当另一个应用程序广播特定窗口消息(使用RegisterWindowMessage 注册的自定义消息)时,我有一个 shell 扩展需要重新加载其配置。

我尝试了几种方法来拦截消息:

  • 在 Windows 资源管理器的窗口上安装窗口子类回调,使用 SetWindowSubclass。这适用于 Window 7,但不适用于 Windows 8,因为显然 DllMain 没有在主线程上调用,而 SetWindowSubclass 不适用于另一个线程。文档中提到了这一点:

    您不能使用子类化辅助函数跨线程对窗口进行子类化

  • 使用SetWindowsHookExCALLWNDPROC 安装挂钩。因为我不想减慢整个系统的速度,所以我只为特定线程(资源管理器的主线程)安装了钩子。这适用于 Windows 8,但不适用于 Windows 7...我怀疑这是因为我挂错了线程,但我不确定。而且无论如何,这种方法似乎过于侵扰。

  • 创建一个仅消息窗口来处理消息。这根本不起作用,因为仅消息窗口不接收广播消息。

有没有可靠的方法在 shell 扩展中接收窗口消息?

窗口消息最初似乎是通知 shell 扩展的最简单方法,但如果您认为另一种机制更合适,我愿意接受建议。

【问题讨论】:

  • 什么样的外壳扩展?
  • @SimonMourier,图标覆盖和上下文菜单处理程序

标签: windows shell winapi shell-extensions window-messages


【解决方案1】:

创建一个隐藏窗口并在其窗口过程中监听消息。

  1. 注册一个窗口类,该类具有除窗口过程和类名之外的所有字段的默认值。您无需在窗口类中指定任何其他内容,因为窗口永远不可见。
  2. 创建窗口时,将0 传递给窗口样式。明确排除WS_VISIBLE
  3. 在创建窗口时将0 传递给WndParent。这将使其成为顶级窗口,因此可以接收广播消息。

【讨论】:

  • 谢谢,我试试看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多