C#(winforms)のアプリ内のすべてのコントロールのクリックイベントを傍受する

StackOverflow https://stackoverflow.com/questions/4279732

質問

アプリケーションのすべての形式ですべてのUIイベントを傍受し、それらをログに書き込むためのアプリケーションを作成したいと思います。このデータは、どのコントロールが最も使用されているか、どの順序で最も使用されているかを確認するために使用できます。問題は、既存のクラスを変更せずに、これを自動的に発生させたいということです。

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

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

前もって感謝します!

役に立ちましたか?

解決

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

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

他のヒント

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

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

また、参照してください この質問 これはあなたの複製です。

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

これがチュートリアルの形式の下の小さな例です.

あなたが望むものを達成できるはずです メッセージフィルター - win32-apisが必要な直接p/invokeは必要ありません!

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top