【问题标题】:Simulating a mouse button click in Windows在 Windows 中模拟鼠标按钮单击
【发布时间】:2010-12-16 22:30:37
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 嗨尼克。您是如何成功使用远程桌面的?我目前正在扩展一个具有远程支持的应用程序。我想知道,您是如何解决文本组件中的文本输入的(如果有的话)?在 Qt 中很容易识别,光标下的小部件是 QLineEdit 还是类似的。但是对于原生 Windows 对象该怎么办呢?

标签: qt button mouse click simulate


【解决方案1】:

这是在 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/W-P/win32/article.php/c4543/

【讨论】:

    【解决方案2】:

    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);
    }
    

    【讨论】:

      【解决方案3】:

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

      #include <windows.h>
      QApplication::desktop()->cursor().setPos(globalX,globalY);
      mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 1, 1, 0, 0);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-02
        • 2019-10-21
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多