6

アプリケーションのすべてのフォームですべての UI イベントをインターセプトし、それらをログに書き込むアプリケーションを作成したいと考えています。このデータを使用して、どのコントロールが最も使用されているか、どの順序で使用されているかなどを確認できます。問題は、既存のクラスを変更せずに、これを自動的に実行したいことです。

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

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

前もって感謝します!

4

4 に答える 4

7

メッセージ フィルタをインストールできます。

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

于 2010-11-25T18:09:26.007 に答える
1

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

もう 1 つのタスクは、HWND (Windows ハンドル) を対応する WinForms コントロールに一致させることです。これを行う方法については、この記事をお読みください(WM_GETCONTROLNAME メッセージ経由)。

あなたの複製であるこの質問も参照してください。

于 2010-11-25T18:05:52.207 に答える
0

Win32 の API メッセージを操作する必要があると思います。

これはチュートリアルの形での小さな例です。

于 2010-11-25T17:59:19.733 に答える
0

メッセージ フィルターを使用して目的を達成できるはずです。Win32 - API への直接の P/Invoke は必要ありません。

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

于 2010-11-25T18:07:19.713 に答える