如何使用C++模拟鼠标点击?

3

我需要模拟鼠标点击应用程序窗口。我正在使用Windows系统。

如何向应用程序窗口所在的屏幕坐标 x, y 发送左键鼠标单击事件?

2个回答

11

使用SendInput()函数:

INPUT Inputs[3] = {0};

Inputs[0].type = INPUT_MOUSE;
Inputs[0].mi.dx = ...; // desired X coordinate
Inputs[0].mi.dy = ...; // desired Y coordinate
Inputs[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;

Inputs[1].type = INPUT_MOUSE;
Inputs[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;

Inputs[2].type = INPUT_MOUSE;
Inputs[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;

SendInput(3, Inputs, sizeof(INPUT));

使用MOUSEEVENTF_ABSOLUTE在多监视器环境中正确指定dxdy的方法,请务必阅读MOUSEINPUT文档中的注释


你的解决方案总是发送消息到0,0,而不是x,y。 - undefined
第二个和第三个输入不包括MOUSEEVENTF_ABSOLUTE标志,因此它们是相对于第一个输入所确定的鼠标位置的。文档中已经说明了这一点:“如果未指定MOUSEEVENTF_ABSOLUTE值,则dx和dy指定相对于上一个鼠标事件(最后报告的位置)的移动。”所以第二个和第三个输入中的dx和dy为0是可以的。 - undefined
值得一提的是,这些评论都没有告诉你如何正确地指定坐标。它们只是给了一些提示,但你需要进行一些实验。 - undefined
@Dan,正如我在答案中所述,MOUSEINPUT的文档详细解释了如何指定鼠标坐标,例如:"如果指定了MOUSEEVENTF_ABSOLUTE值,则dxdy包含介于0和65,535之间的归一化绝对坐标。事件过程将这些坐标映射到显示表面上。坐标(0,0)映射到显示表面的左上角;坐标(65535,65535)映射到右下角。在多显示器系统中,这些坐标将映射到主显示器" - undefined
1
@RemyLebeau 你是指MSDN上的“备注”部分吗?不,它们并没有“解释”任何东西。你和我可能知道y=mx+b是什么意思,但它并没有向任何人解释清楚。这就是为什么有很多类似的页面,答案都不够详细的原因。 - undefined

0
你可以使用mouse_event函数来点击(x,y):
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);

3
mouse_event()已被SendInput()取代,您应该使用后者。您链接的文档甚至也这样说。 - undefined
@MustafaChelik 你的解决方案总是发送消息到光标坐标,而不是x,y坐标。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接