2009-11-16 129 views
2

我正在使用QT编写C++中的远程桌面克隆。到目前为止,我可以将鼠标光标移到正确的位置。 QT有一个很好的setPos功能。不过,我有点迷失于用来模拟鼠标按键点击的API/Library。在Windows中模拟鼠标按钮点击

我知道的一种方法是使用窗口的HWND将WM_(event)发送到窗口。但是,我希望有一个更明显的方法来完全控制鼠标。是否有任何其他方式告诉操作系统鼠标左键已被点击?

谢谢。

+0

嗨尼克。您如何在远程桌面上取得成功?我目前正在使用远程支持扩展应用程序。我想知道,你是如何解决文本输入的文本组件(如果有的话)?在Qt中很容易识别,光标下的Widget是QLineEdit还是类似的。但是对于本机Windows对象应该怎么做? – 2014-07-21 23:03:47

回答

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

+1

这是非常错误的,参数不是* long *。 – 2011-01-10 21:37:34

3

卢卡斯Šalkauskas'解决方案已经为我工作了一段时间,但今天它突然导致了f ollowing错误(也许是由于Windows更新一些.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); 
} 
8

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

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

它真的有效! – 2013-04-22 10:19:55