我正在使用QT在C ++中编写远程桌面克隆。到目前为止,我能够将鼠标光标移动得很好。 QT有一个很好的setPos函数。但是,我有点迷失用于模拟鼠标按钮点击的API /库。
我知道的一种方法是使用窗口的HWND将WM_(事件)发送到窗口。但是,我希望有一个更为突出的方法来完全控制鼠标。有没有其他方法告诉操作系统单击了鼠标左键?
感谢。
答案 0 :(得分:9)
结合所有togegher,这是Qt的代码:
#include <windows.h>
QApplication::desktop()->cursor().setPos(globalX,globalY);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 1, 1, 0, 0);
答案 1 :(得分:3)
LukasŠalkauskas的解决方案已经为我工作了很长一段时间,但今天它突然导致了以下错误(可能是由于Windows Update的一些.NET更新?)
调用PInvoke函数 'SampleMethod'失衡了 堆。这可能是因为 托管PInvoke签名没有 匹配非托管目标签名。 检查调用约定和 PInvoke签名的参数 匹配目标非托管签名。
所以我切换到pinvoke.net sample code,现在效果很好:
[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);
}
答案 2 :(得分:2)
这是在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