0

私は SetWindowsHookEx をいじっています。具体的には、マウスまたはキーボードを介して、アクティブ化された (デスクトップ上の) ウィンドウを見つけられるようにしたいと考えています。

SetWindowsHookEx の MSDN ドキュメントを読むと、WH_CBT タイプがその仕事をするように見えます。私はdllを作成し、そこにすべてのコードを入れました.GUIアプリから制御します(フック解除も処理します)。

しかし、GUIアプリをアクティブ化したときにのみアクティベーションコードを取得しているように見えますが、アクティブ化した他のアプリは無視されます。

私のdllには、次のようなセットアップコードとCBTProcがあります。

LRESULT WINAPI CBTProc(int Code, WPARAM W, LPARAM L) {
   if(Code<0) CallN....

   if (Code == HCBT_ACTIVATE) { // never get unless I activate my app
      HWND a = reinterpret_cast<HWND>(W);
      TRACE("this window was activated %d\n", a);
   }

   CallNext....
}

EXPORTED HHOOK WINAPI Setup(HWND MyWind) {
   ...
   // gDllUInstance set in dllmain
   return SetWindowsHookEx(WH_CBT, CBTProc, gDllUInstance, 0);
}

すべて非常に単純なもので、セットアップをdllから移動しようとしましたが、それでも同じ効果が得られます。

dll が他のプロセスにロードされているように見えます。取得している DLL_PROCESS_ATTACH の数を数えており、その増加を確認できます (あまり科学的ではありません。

これは 32 ビット OS - win2k3 で実行される 32 ビット コードであることに注意してください。

フッキングメカニズムに対する私の期待は間違っていますか? アプリのアクティベーションのみを取得する必要がありますか、それとも別のタイプのフックが必要ですか?

編集: トレース機能はファイルに書き込み、アクティベーションの送信元を通知します

ティア。

4

1 に答える 1

0

Turns out its working ok, as Hans points out, i'm just not seeing the output from the debugger from the other processes, if I put in some extra tracing code - one trace file per attached process - I can see can see that things are working after all.

Many thanks for the replies.

于 2012-01-19T16:39:52.127 に答える