16

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 フォームを閉じるだけで、簡単にフックをアンインストールできます。注意してテストしてください。

SO5036143.ZIP をダウンロード: mirror 1 , mirror 2

4

2 に答える 2

11
  • WPF ウィンドウは、HwndSource (Window.CreateSourceWindow) を作成します。
  • HwndSource は、HwndWrapper (HwndSource.Initialize) を作成します。
  • HwndWrapper は、HwndSource で指定されたフックに Windows メッセージをデリゲートするウィンドウ プロシージャを使用して Win32 ウィンドウを作成します。
  • 1 つのフックは、Windows メッセージを 4 つの入力プロバイダー (スタイラス、マウス、キーボード、appcommand) にデリゲートする HwndSource.InputFilterMessage です。
  • プロバイダーは、適切な Windows メッセージを解析し、InputManager を呼び出して、要素で入力イベントを発生させます。

HwndMouseInputProvider は、WM_MOUSEMOVE、WM_LBUTTONDOWN などのメッセージを処理します。したがって、マウスとキーボードの入力を処理するために使用される DirectInput はないと思います。

于 2011-03-01T19:16:10.290 に答える
1

フィルターを設定しようとしても、.NET Framework には文書化されていない API があり、WPF のフィルターを高い優先度に設定して、WPF が正しく機能することを確認するためにフィルターをまったく実行できない場合があります。

WPF ウィンドウは通常のウィンドウと同じであり、WPF をリモート デスクトップなどのソフトウェアで動作させるために、既存の入力 API および新しい API で正しく動作することになっています。

アップデート:

Windows フックは以前の Windows API で提供されていました。当時はイベント バブリングやイベントのプレビューなどの概念が利用できず、そのような実装にはフックが便利だったからです。WPF は、プレビュー イベントとイベントのバブリングによるイベント フィルタリングを既に提供しています。これが、フックがサポートされていない可能性がある理由です。

フックを使用するアプリケーションはごくわずかであるため、フックは API の標準的な部分ではありません。Microsoft のフィルターがフック フィルターを許可していないというバグを Microsoft に投稿できるかもしれません。

于 2011-02-27T08:10:55.753 に答える