Windowsでマウスボタンのクリックをシミュレート
質問
私はQTを使ってC ++でリモートデスクトップクローンを書いています。これまでのところ私は罰金の周りにマウスカーソルを移動することができますよ。 QTは、そのための素晴らしいsetPos機能を持っています。しかし、私は、API /ライブラリは、マウスボタンのクリックをシミュレートするために使用すべきことの失われたビットです。
私の知る一つの方法は、ウィンドウのHWNDを使用してウィンドウにWM_(イベント)を送信することです。しかし、私はマウスを完全に制御を取るために、より顕著な方法があった期待していました。マウスの左ボタンがクリックされたオペレーティングシステムを指示する他の方法はありますか?
感謝します。
解決
これは、C#であるが、あなたのアイデアを得るために役立つかもしれません。
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
public void DoMouseClick()
{
int X = Cursor.Position.X;
int Y = Cursor.Position.Y;
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
}
役立つかもしれないのリソース:の
http://msdn.microsoft.com /en-us/library/ms646260%28VS.85%29.aspxする
http://www.codeguru.com/Cpp/ WP / win32の/ article.php / c4543 / の
他のヒント
すべてのtogegherを組み合わせることで、ここではQtのためのコードがあります:
#include <windows.h>
QApplication::desktop()->cursor().setPos(globalX,globalY);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 1, 1, 0, 0);
ルーカスŠalkauskasのソリューションは、かなりの時間が私のために働いたが、今日それが突然、次のエラーになりました(おそらくWindows Updateでいくつかの.NET更新に?)
のPInvoke関数の呼び出し 「SampleMethodは」アンバランスを持っています スタック。これは可能性がありますので、 管理のPInvoke署名はしていません 非管理対象の署名と一致。 呼び出し規約にいることを確認し、 PInvokeシグネチャのパラメータ ターゲット管理対象外の署名と一致します。
だから私は、 pinvoke.netサンプルコードするに切り替え、それが動作しますさてます:
[DllImport("user32.dll")]
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
[Flags]
public enum MouseEventFlags
{
LEFTDOWN = 0x00000002,
LEFTUP = 0x00000004,
MIDDLEDOWN = 0x00000020,
MIDDLEUP = 0x00000040,
MOVE = 0x00000001,
ABSOLUTE = 0x00008000,
RIGHTDOWN = 0x00000008,
RIGHTUP = 0x00000010
}
public static void LeftClick(int x, int y)
{
Cursor.Position = new System.Drawing.Point(x, y);
mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
}