ユーザーアクティビティを追跡するために、メインアプリケーションスレッド用にWindows Hookを使用し、WM_COMMANDメッセージを監視しています。WndProcフックはメニューからWM_COMMANDを受け取りません
予想通り、私は、ダイアログのボタン、ツールバーボタン、アクセラレータ、ポップアップメニューからそれらを受け取ったが、私は、メインメニューからそれらを受信しません。
奇妙なことに、Spy ++はメインウィンドウを受信しています。何が間違っていますか?ミニマル
currentHook = SetWindowsHookEx(WH_CALLWNDPROC,
HookProc, 0, GetCurrentThreadId());
HookProc、::
LRESULT CALLBACK HookProc(int nCode, WPARAM wp, LPARAM lp)
{
CWPSTRUCT cwp = *(CWPSTRUCT *)lp;
if (cwp.message == WM_COMMAND)
{
ATLTRACE("[hook!] WM_COMMAND id=%d\n", LOWORD(cwp.wParam));
}
return CallNextHookEx(currentHook, nCode, wp, lp);
}
(実際のコードはより複雑で、など再入をチェックする必要がありますが、私はそれをremvoedてきたフックをインストール
このテスト)
アイデア?
[編集]私がテストするメインウィンドウはMFCアプリケーションですが、計測コードはMFCを使用しません。
ちょっとした提案ですが、GetWindowLongとGWL_WNDPROCを使用して既存のWNDPROCを取得し、新しいWNDPROCをSetWindowLongで独自のカスタムWNDPROCに設定し、新しいWNDPROCでCallWindowProcを使用して古いWNDPROCを呼び出すことは可能ですか?このようにして、すべてのウィンドウメッセージを絶対に取得し、フックについて心配する必要はありません。私はそれが可能かどうかはわかりませんが、私は元々その問題にアプローチしようとしていたでしょう。 – dreamlax
@dreamlax:私はすでにサブクラス化を試みましたが、これはうまく動作します。それでも、私は、関連する各ウィンドウのCreate/OnInitDialogに1行追加する必要があります。この時点では、私はまだ避けたいものです。 – peterchen