2

我正在使用 QT 在 C++ 中编写远程桌面克隆。到目前为止,我可以很好地移动鼠标光标。QT 有一个很好的 setPos 函数。但是,对于用于模拟鼠标按钮单击的 API/库,我有点迷茫。

我知道的一种方法是使用窗口的 HWND 将 WM_(event) 发送到窗口。但是,我希望有一种更突出的方法可以完全控制鼠标。有没有其他方法可以告诉操作系统单击了鼠标左键?

谢谢。

4

3 回答 3

9

结合所有在一起,这是Qt的代码:

#include <windows.h>
QApplication::desktop()->cursor().setPos(globalX,globalY);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 1, 1, 0, 0);
于 2011-03-13T15:16:22.163 回答
3

Lukas Šalkauskas 的解决方案已经为我工作了很长一段时间,但今天它突然导致以下错误(可能是由于 Windows 更新的一些 .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);
}
于 2010-06-09T01:35:26.207 回答
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

http://www.codeguru.com/Cpp/WP/win32/article.php/c4543/

于 2009-11-16T04:42:04.817 回答