SetWindowsHookEx
およびを使用して、特定のマウス クリックをグローバルに (システム全体で) フィルタリングしますWH_MOUSE_LL
。問題は、WPF アプリケーションでは機能しないことです (システムにこれらのクリックを無視するように指示したかどうかに関係なく、すべての WPF アプリケーションがマウス クリックを検出します)。私はすでに同様の質問をここDirectInput
で行っていますが、入力を検出するために標準の Windows メッセージの代わりにWPF が使用することを前提としています。しかし、そうですか?
を使用してマウス クリックを WPF アプリケーションに挿入SendMessage
できるコードを見つけることができました。それが可能であれば、それはどういうわけか、WPFがDirectInput
マウス入力に使用しないことを意味すると思います。しかし、WPF アプリケーションがマウス クリックを検出するのを防ぐことができないのはなぜSetWindowsHookEx
でしょうか。
この質問は主にマウス入力に関するものですが、キーボード入力でもどのように機能するかを知りたいです。
例
奇妙な WPF の動作を再現するために、次のソリューションをすぐに作成しました。3 つのプロジェクトで構成されています。
HookTester
StartUp プロジェクトは、他の 2 つのプロジェクトを自動的に起動するため、主にこの 1 つに注意する必要があります。起動時にマウス フックをインストールし、フォームを閉じるときにフックをアンインストールします。WinFormsTest
は、マウスの右ボタンをテストできるデフォルトのコンテキスト メニューを備えた TextBox を含みます。HookTester の実行中は、マウスの右ボタンを使用してコンテキスト メニューを呼び出すことはできません。WpfTest
には TextBox も含まれており、カスタム コンテキスト メニュー (デフォルト メニューも使用できます) を備えているため、ここでもマウスの右ボタンをテストする場所になります。HookTester が実行されている限り、(マウスの右ボタンを使用して) コンテキスト メニューを呼び出すことはできないはずですが、何らかの理由で、とにかくメニューが表示されます (なぜ???)。
警告:ソリューションを実行すると、HookTester プロジェクトが開始され、すぐにフックがインストールされ、マウスの右ボタン クリックが (システム全体で) 拒否されます。HookTester フォームを閉じるだけで、簡単にフックをアンインストールできます。注意してテストしてください。