2014-11-06 62 views
0

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

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

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

    不能使用子类辅助函数的子类窗口跨线程

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

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

是否有一种可靠的方式在shell扩展中接收窗口消息?

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

+0

什么样的shell扩展? – 2014-11-07 07:05:38

+0

@SimonMourier,图标叠加和上下文菜单处理程序 – 2014-11-07 09:19:44

回答

2

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

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

谢谢,我会试试 – 2014-11-06 17:39:01

+0

完美的作品,谢谢! – 2014-11-07 09:58:17