私は 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 ビット コードであることに注意してください。
フッキングメカニズムに対する私の期待は間違っていますか? アプリのアクティベーションのみを取得する必要がありますか、それとも別のタイプのフックが必要ですか?
編集: トレース機能はファイルに書き込み、アクティベーションの送信元を通知します
ティア。