3

WM_LBUTTONDOWN および WM_LBUTTONUP メッセージをウィンドウに送信しようとしました (カーソルを動かさずにマウス クリックをシミュレートします)。

私のプログラムは多くのウィンドウで非常にうまく機能していますが、いくつかは機能しません:( レジストリ エディタ、Yahoo Messenger、一部の Firefox サイトなどのように...

上記のものと連携するにはどうすればよいですか??

注#1:私はWin7を使用しています

注 2: 私のコードは、API と関数を呼び出して、特定のウィンドウ ハンドルに適用するだけです。正常に動作しますが、すべてのウィンドウで機能するわけではありません:(

4

2 に答える 2

4

この問題を引き起こす可能性があるのは、UIPI または User Interface Privacy Isolation と呼ばれる UAC の別の側面です。昇格されていないプログラムが昇格されたプログラムの機能をハイジャックするのを防ぐように設計されています。これは確かに Regedit.exe の問題を説明しています。プログラムが UAC を指揮してレジストリに何かを突っ込むことができれば、明らかに UAC は効果がありません。この制限を回避するには、プログラムを昇格して実行する必要があります。

もう 1 つの問題は、SendMessage() がマウス入力を適切にシミュレートしないことです。送信するメッセージは通常、メッセージ キューにポストされます。代わりに PostMessage() を使用する必要があります。WM_MOUSEMOVE もエミュレートする必要があります。

マウス入力をシミュレートする適切な方法は、SendInput() を使用することです。これは、マウス ドライバーの動作を正確にエミュレートするものであり、プログラムが違いを見分ける方法はありません。ただし、自動化しようとしているプログラムがフォアグラウンドで実行されることを確認する必要があるという追加の要件があります。これは非常に難しく、SetForegroundWindow() の信頼性は十分ではありません。そのため、実際にマウス メッセージをフォアグラウンド ウィンドウにのみ送信したい場合にのみ、SendInput() を検討してください。

于 2012-05-12T10:46:45.297 に答える
0

SwitchToThisWindowの代わりに呼び出すことができます。これははるかに優れており、ほとんどの場合に機能します。次に、構造体をまったく扱っていないため、はるかに快適なorをSetForegroundWindow呼び出します。SendInputmouse_event

于 2016-03-05T10:30:52.353 に答える