2009-07-07 13 views
2

ユーザーアクティビティを追跡するために、メインアプリケーションスレッド用に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を使用しません。

+0

ちょっとした提案ですが、GetWindowLongとGWL_WNDPROCを使用して既存のWNDPROCを取得し、新しいWNDPROCをSetWindowLongで独自のカスタムWNDPROCに設定し、新しいWNDPROCでCallWindowProcを使用して古いWNDPROCを呼び出すことは可能ですか?このようにして、すべてのウィンドウメッセージを絶対に取得し、フックについて心配する必要はありません。私はそれが可能かどうかはわかりませんが、私は元々その問題にアプローチしようとしていたでしょう。 – dreamlax

+0

@dreamlax:私はすでにサブクラス化を試みましたが、これはうまく動作します。それでも、私は、関連する各ウィンドウのCreate/OnInitDialogに1行追加する必要があります。この時点では、私はまだ避けたいものです。 – peterchen

答えて

6

メニューコマンドは送信されず、送信されません(はい、この文書は不明瞭ですが、Spy ++は真実を示しています)。 WH_CALLWNDPROCフックは送信されたメッセージのみを捕捉します。

あなたは、投稿されたメッセージを傍受するWH_GETMESSAGEフックを使用することができるはずです。 の両方のフォームを処理する場合は、にはが必要です。

+0

が動作します!ありがとう! – peterchen

0

WM_MENUCOMMANDを追跡しようとしましたか?

+0

では、メニューにMNS_NOTIFYBYPOSが設定されている必要がありますが、プロジェクトのコード/ソースを変更することは避けたいと考えています。また、どのWM_MENUCOMMANDメッセージの後ろにWM__COMMANDメッセージがないのか把握しておく必要があります。醜い音です – peterchen

関連する問題