0

RegisterWindowMessage特定のウィンドウ メッセージ (に登録されたカスタム メッセージ) が別のアプリケーションによってブロードキャストされたときに、その構成をリロードする必要があるシェル拡張機能があります。

メッセージを傍受するためにいくつかの方法を試しました。

  • を使用して、Windows エクスプローラーのウィンドウにウィンドウ サブクラス コールバックをインストールしますSetWindowSubclass。これは Window 7 では機能しますが、Windows 8 では機能しません。明らかDllMainにメイン スレッドでは呼び出されSetWindowSubclassず、別のスレッドからは機能しないためです。これはドキュメントに記載されています:

    サブクラス化ヘルパー関数を使用して、スレッド間でウィンドウをサブクラス化することはできません

  • CALLWNDPROCを使用して のフックをインストールしSetWindowsHookExます。システム全体の速度を落としたくないので、特定のスレッド (エクスプローラーのメイン スレッド) だけにフックをインストールします。これは Windows 8 では機能しますが、Windows 7 では機能しません...これは、間違ったスレッドにフックしているためだと思われますが、よくわかりません。とにかく、このアプローチは過度に邪魔に思えます。

  • メッセージを処理するメッセージのみのウィンドウを作成します。メッセージのみのウィンドウはブロードキャストされたメッセージを受信しないため、これはまったく機能しません。

シェル拡張でウィンドウ メッセージを確実に受信する方法はありますか?

最初はウィンドウ メッセージがシェル拡張機能に通知する最も簡単な方法のように思われましたが、別のメカニズムがより適切であると思われる場合は、提案をお待ちしています。

4

1 に答える 1

2

非表示のウィンドウを作成し、そのウィンドウ プロシージャでメッセージをリッスンします。

  1. ウィンドウ プロシージャとクラス名以外のすべてのフィールドに既定値を持つウィンドウ クラスを登録します。ウィンドウは表示されないため、ウィンドウ クラスで他に何も指定する必要はありません。
  2. ウィンドウを作成するときは0、ウィンドウ スタイルを渡します。具体的には除外しWS_VISIBLEます。
  3. 0ウィンドウを作成するWndParentときに を渡します。これにより、ウィンドウが最上位ウィンドウになり、ブロードキャスト メッセージを受信できるようになります。
于 2014-11-06T16:48:20.327 に答える