C#(winforms)のアプリ内のすべてのコントロールのクリックイベントを傍受する
-
28-09-2019 - |
質問
アプリケーションのすべての形式ですべてのUIイベントを傍受し、それらをログに書き込むためのアプリケーションを作成したいと思います。このデータは、どのコントロールが最も使用されているか、どの順序で最も使用されているかを確認するために使用できます。問題は、既存のクラスを変更せずに、これを自動的に発生させたいということです。
フォームのすべてのコントロールのクリックイベントにメソッドを添付するプロトタイプを作成しましたが、これはすべてのフォームに対してどのように行うことができますか?反射はイベントを操作するときにターゲットオブジェクトが必要ですが、スタートアップフォームのみに簡単にアクセスできます。
オブジェクトのコンストラクターをフックする方法はありますか?次に、新しいフォームのすべてのイベントで自分の方法を「注入」することができました。または、これを行う別の方法があるかもしれません。
前もって感謝します!
解決
インストールできます メッセージフィルター.
メッセージフィルターは、実装するオブジェクトです IMessageFilter
. 。 Winformsはあなたを呼びます PreFilterMessage
スレッドのメッセージループを通過するすべてのメッセージのメソッド。これは、アプリケーション全体のユーザー入力を監視するのに十分です(そして、それを操作するオプションを提供します)。
他のヒント
Windows APIでは、これはローカルフックを使用して実行されます(ローカルマウスフックを使用して設定できます setwindowshookex 働き)。これがあなたの仕事を行うための適切な方法です。 C#では、SetWindowshookexにアクセスするには、P/Invokeを使用する必要があります。
もう1つのタスクは、HWND(Windowsハンドル)を対応するWinFormsコントロールに一致させることです。読む この記事 これを行う方法については(wm_getControlNameメッセージを介して)。
また、参照してください この質問 これはあなたの複製です。
Win32のAPIメッセージを使用する必要があると思います。
あなたが望むものを達成できるはずです メッセージフィルター - win32-apisが必要な直接p/invokeは必要ありません!
のヘルプを参照してください IMessageFilter
詳細については、インターフェイス。