2010-11-25 10 views
6

私のアプリケーションのすべてのフォームですべてのUIイベントをインターセプトし、それらをログに書き込むアプリケーションを作成したいとします。このデータは、どのコントロールが最も使用されているのか、どのような順序であるのかなどを調べるのに使用することができます。問題は、既存のクラスを変更せずにこれを自動的に行うことです。C#(WinForms)のアプリケーション内のすべてのコントロールのクリックイベントを傍受する

フォーム内のすべてのコントロールのクリックイベントにメソッドを割り当てるプロトタイプを作成しましたが、これをどのようにすべてのフォームで行うことができますか?イベントを操作するときにReflectionにはターゲットオブジェクトが必要ですが、スタートアップフォームだけに簡単にアクセスできます。

オブジェクトのコンストラクタをフックする方法はありますか?それで私は、新しいフォームのすべてのイベントに自分のメソッドを「注入」することができました。あるいは、これを行う別の方法があります。

ありがとうございます!

答えて

7

message filterをインストールできます。

メッセージフィルタは、IMessageFilterを実装するオブジェクトです。 WinFormsは、スレッドのメッセージループを通過するすべてのメッセージに対して、PreFilterMessageメソッドを呼び出します。これは、アプリケーション全体のユーザー入力を監視するのに十分です(また、操作のオプションも提供します)。

1

Windows APIでは、これはローカルフックを使用して行われます(SetWindowsHookEx関数を使用してローカルマウスフックを設定できます)。これはあなたの仕事を行う適切な方法です。 C#では、P/Invokeを使用してSetWindowsHookExにアクセスする必要があります。

もう1つのタスクは、HWND(ウィンドウハンドル)を対応するWinFormsコントロールに一致させることです。 これを行う方法はthis articleです(WM_GETCONTROLNAMEメッセージ経由)。

this questionも参照してください。これはあなたの複製です。

0

message filters - で直接達成する必要があります.P/Invoke to Win32-APIは必要ありません。

詳細については、IMessageFilterインターフェイスのヘルプを参照してください。

関連する問題