如何在shell扩展中拦截窗口消息



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

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

  • 使用SetWindowSubclass在Windows资源管理器的窗口上安装窗口子类回调。这在Windows7上有效,但在Windows8上无效,因为显然DllMain没有在主线程上调用,而SetWindowSubclass也不能在另一个线程上工作。文件中提到了这一点:

    不能使用子类化助手函数在线程之间对窗口进行子类化

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新