7

私は WPF アプリケーションに入力を挿入することに取り組んできました。このプロジェクトを困難にしているのは、アプリケーションがバックグラウンドで実行されている (つまり、別のアプリケーションが入力フォーカスを持っている) 場合でも、アプリケーションに入力を注入できる必要があることです。したがって、 SendInput()関数を使用することは問題外です。

これまでのところ、キーボード入力は機能していますが、マウス入力の挿入に問題があります。

Spy++ を使用して、マウス ボタンを物理的にクリックしたときに WPF ウィンドウに送信されるウィンドウ メッセージを観察しました。次に、同じマウス メッセージ ( や などWM_LBUTTONDOWN)WM_LBUTTONUPを手動で作成し、明示的に WPF ウィンドウに送信して、マウス入力をエミュレートします。

残念ながら、これは期待どおりには機能しません (テスト目的で、WPF ウィンドウをフォアグラウンド ウィンドウとして設定した場合でも)。

テスト WPF ウィンドウにボタンを追加しました。クリックするとメッセージ ボックスが表示されます。ただし、ボタンの上にカーソルを手動で配置したときに適切なマウス メッセージを挿入しても、ボタンはクリックされません (つまり、クリックされたイベントは WPF フレームワークによって発生しません)。

実際のダイアログ (クライアント領域) にマウス クリックのハンドラーを追加すると、カーソルをダイアログ自体の上に置き、以前と同じウィンドウ メッセージを挿入すると、そのハンドラーが呼び出されます。

this.MouseLeftButtonDown += WndMouseDown;

public void WndMouseDown(object sender, EventArgs e)
{
   ...
}

奇妙なことに、ボタンのプッシュ モードを Press に変更すると (つまり、デフォルトのマウス アップではなく、マウス ダウンでクリックされたと見なされます)、以前と同じメッセージを挿入すると、ボタン クリック イベントが発生するようになりました。(上記の例のハンドラーは、マウスのダウンとアップの両方で正しく起動することに注意してください。そのため、WPF フレームワークは両方のメッセージを正常に処理しているように見えます。)

マウス クリック イベントが WPF フレームワークによって発生するために満たす必要がある他の基準がいくつかあるようです。マウス入力が WPF で内部的にどのように処理されるか、またはマウスの上下のメッセージがボタンのクリックとして解釈されない理由を知っている人はいますか?

(このアプローチ [ウィンドウ メッセージの送信] は、[スタート] → [ファイル名を指定して実行] ダイアログなどの通常の Win32 ウィンドウでうまく機能することに言及する価値があります。ここでの違いは、WPF には物理的な Win32 ウィンドウが 1 つしかなく、残りは WPF 固有であることです。ウィンドウ メッセージは、実際のボタンではなく、その最上位ウィンドウに移動します)。

私はこれに対する答えを高低で探してきました。考えやアイデアをいただければ幸いです。

4

3 に答える 3

3

UIAutomationルートを使用することを強くお勧めします。ウィンドウハンドルでAutomationElementを作成します。ボタンまでクロールして呼び出します。どうやってキーボード入力を機能させることができたのか知りたいのですが。私は現在、逆の問題を解決しようとしています。仮想キーボードメッセージに応答するために、WPFウィンドウを取得する方法(Win32呼び出しを介してウィンドウにhWndを取得することができました)。問題のウィンドウに++spyセッションを記録し、その入力を複製しても成功しませんでした。

于 2009-10-06T03:33:12.900 に答える
1

これを行うには、UI オートメーションを使用します。ウィンドウ メッセージを介して入力を手動でシミュレートしようとするのは、ロシアに対して陸戦を開始しようとするのと同じように、教科書的な間違いです。

于 2009-09-04T03:39:43.060 に答える
0

あなたの戦略は基本的に健全ですが、別のプロセスが所有するウィンドウにメッセージを送信するには、最初にメッセージを登録する必要があります。

事業全体を解説した記事はこちら。サンプル コードは残念ながら VB ですが、それでも問題ないと確信しています。

于 2009-09-04T04:01:43.133 に答える