2014-11-06 52 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