2

重複の可能性:
C#でマウスクリックをシミュレートするには?

私が試してみました

Window = FindWindow(null, "untitled - Paint");
PostMessage(WindowToFind, WM_MOUSEMOVE, 0, location); 
PostMessage(WindowToFind, WM_LBUTTONDOWN, ((int)Keys.LButton), location);

場所など100 * 0x10000 + 100です100x100。間違っているとは思いません。と交換しようと((int)Keys.LButton)しましたが0、うまくいきませんでした。私はマウスムーブと左ボタンのコンストに使用する(ポストメッセージは何もせずに待機する必要があります)thread.sleepの間lbuttondownに入れてみました。lbuttonupthread.sleep0x02000x0202

なぜそれがまったく機能しないのかわかりません。

4

1 に答える 1

4

そのとおりです。および関数は、マウス(またはキーボード)イベントを合成することを目的としたものではありませんPostMessageSendMessage。彼らは時々それをするために働くかもしれません、しかしそれはあなたがほとんどの場合彼らが働かないのであなたが頼るべきものではありません。

代わりに、このSendInput関数を使用してマウスイベントを適切に合成する必要があります。他のWin32API関数と同様に、C#から呼び出すには、P/Invokeを実行する必要があります。この定義は、ドキュメントから手動で生成することも、インターネット上の他の場所で簡単に見つけることもできます。唯一注意が必要なのは、関数自体だけでなく、適切な構造体も宣言する必要があるということです。

このmouse_event関数は、マウスイベントを合成する方法としても存在しSendInputますが、リンクされたドキュメントで明らかにされているように、この関数は廃止され、SendInput。常にSendInput新しいアプリケーションで使用することをお勧めします。

唯一の問題は、これらのマウスイベントを別のアプリケーションに送信しようとしているように見えることです。SendInput単にイベントをキーボード/マウスストリームに挿入するだけなので、これは少し問題を引き起こします。それらを処理するアプリケーションは、フォアグラウンドウィンドウを備えたアプリケーションになります。したがって、最初に他のウィンドウにフォーカスを設定し、UIPIに違反しないようにする必要があります。

ただし、使用しているコードは別のレベルでは比較的壊れやすいものです。ドキュメントを別の名前で保存するとすぐに、ペイントウィンドウの名前が変更されます。これは、Windows9がPaintの名前を別の名前に変更しないことを前提としています。以前はこのアプリは「Paintbrush」と呼ばれていました。うまくいけば、これはあなたが達成しようとしていることのほんの一例です。いずれにせよ、盲目的に入力を挿入するのではなく、より堅牢な自動化方法(Microsoft UIオートメーションフレームワークなど)を検討することをお勧めします。

于 2012-11-30T23:37:11.350 に答える