在Mac OS X上模拟鼠标点击无法在一些应用程序中生效

8
我正在使用C ++编写适用于Mac OS X 10.6及更高版本的应用程序。 应用程序的一部分需要模拟鼠标移动和点击。 我目前通过使用“CGEventPost(kCGHIDEventTap,event)”来发布“CGEvent”对象来实现此目的。
这在很大程度上有效 - 我可以轻松模拟鼠标移动和点击,但在某些区域似乎会失败。例如:
- 在Mozilla Firefox和Safari中,我可以单击所有菜单,但无法单击网站内的链接。 当我尝试时,链接会被突出显示,但浏览器从未跟随链接。 但是,我可以右键单击链接,选择“在新标签页中打开链接”,然后一切正常。 使用“CGEventCreateMouseEvent(...)”创建鼠标事件可以使事件在Web浏览器中起作用。 - 我可以单击“Dashboard”图标以显示仪表板,但无法单击任何仪表板小部件上的“i”按钮。 同样,单击聚光灯搜索小部件中的任何搜索结果也不起作用。
这种不一致性跨越应用程序边界。可能是什么原因?
4个回答

8

要让这些应用程序相信您确实生成了点击,您需要在鼠标抬起事件中显式设置“点击状态”字段的值为1(默认为0)。以下代码将完成此操作:

CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1);

对于鼠标按下,也需要将其设置为1,但是可以使用CGEventCreateMouseEvent()而不是CGEventCreate()来完成。

我已经测试过了,在仪表板中的'i'按钮和Spotlight搜索结果中都可以正常工作。

(顺便说一句,如果您要模拟双击,则需要将第二次点击的鼠标按下和鼠标抬起事件的点击状态均设置为2。)


1
大多数菜单都是通过鼠标按下事件激活的。在鼠标抬起事件后,超链接会被跟踪。只有当鼠标点击但没有长时间按下时,“i”按钮才有效。所有这些似乎表明您存在时间问题,请尝试多次按下计时。

这听起来像是一个有前途的线索。我刚刚计时了发送鼠标按下和鼠标松开事件之间的间隔 - 一个典型的点击需要42毫秒,这对我来说应该足够短,可以生成一个点击事件而不是点击并保持或其他什么... - Thomi
确实,这不是一个时间问题。只要设置好点击计数,任何合理的时间都可以。 - Nick Moore

0

0
使用OSXVnc。我看到他们使用CGPostMouseEvent()而不是CGPostEvent()

1
CGPostMouseEvent在10.6中已经被弃用。感谢您的建议,但我宁愿不使用弃用的函数。 - Thomi
2
CGPostMouseEvent()已被CGEventCreateMouseEvent()所取代。为什么不使用它?http://developer.apple.com/mac/library/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventCreateMouseEvent - Taybin
从CGEventCreate()更改为CGEventCreateMouseEvent()已经解决了Firefox的问题 - 这很奇怪,毕竟我设置了相同的参数,但没有解决仪表板问题。 - Thomi
无论您使用哪个函数创建事件,仍然需要使用CGPostEvent()将其发布。 - Thomi
1
这个方法有效的原因是CGEventCreate()总是将点击状态设置为0,而CGEventCreateMouseEvent()将其设置为1表示鼠标按下,0表示鼠标松开。因此,它解决了问题的一部分。 - Nick Moore

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