2012-05-12 41 views
3

ウィンドウにWM_LBUTTONDOWNとWM_LBUTTONUPメッセージを送信しようとしました(カーソルを動かさずにマウスのクリックをシミュレートします)。SendMessage()関数が機能しないのはなぜですか?

私のプログラムは、多くのウィンドウ上で非常に良い取り組んでいるが、 :( などレジストリエディタ、Yahooメッセンジャー、いくつかのFirefoxのサイトで、同様に動作しないことをいくつかがあります...どのように

私は、上記からのもので動作するように作ることができます??

NOTE#1:私が使用してwin7の

NOTE#2:私のコードは、単にAPIと関数を呼び出すと、特定のウィンドウハンドルの上にそれらをaplyされ、そのOKですが、すべてのウィンドウでは動作しません。

+0

レジストリエディタは管理者として実行されるため、管理者として実行されている場合を除き、プログラムにはWindowsメッセージを送信する権限がありません。 – Ben

答えて

4

この問題を引き起こす可能性があるのは、UIPIまたはユーザーインターフェイスのプライバシー分離と呼ばれるUACの別の側面です。昇格していないプログラムが昇格したプログラムの能力を乗っ取ることを防ぐために設計されています。これは確かにRegedit.exeの問題を説明している。明らかに、UACはプログラムがレジストリに物を突き刺す命令を出すことができれば効果的ではない。この制限を回避するには、プログラムを上げる必要があります。

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

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

+0

Hansさんに通知してくれてありがとうございます フォアグラウンドのウィンドウだったら、それはとても簡単でした:)しかし、はい、私はカーソルを移動せずにクリックをシミュレートしたいので、ウィンドウが最小限に抑えられます。そう私は代わりにPOSTMESSAGEを使用する場合、それはより良く動作しますか? –

+0

最小化されたウィンドウをクリックしますか?それは奇妙なことです。それ自体に失敗の理由がたくさんあります。 –

+0

私はUIPIだったので、私はSpy ++を掘り下げ、PostとSendのさまざまな種類のメッセージを試してこれを動作させました。投稿してくれてありがとう、あなたのおかげで私はそれを最終的に働いた。 – Fehr

0

あなたははるかに優れている、それはほとんどの時間の作品SwitchToThisWindow代わりのSetForegroundWindowを呼び出し、その後、あなたはすべての構造体を扱っていないので、はるかに快適である、SendInputまたはmouse_eventを呼び出すのいずれかすることができます。

関連する問題