在Mac OS X上模拟鼠标点击对某些应用程序不起作用

时间:2010-03-03 08:52:06

标签: c++ macos events mouse

我正在用C ++编写Mac OS X 10.6及更高版本的应用程序。应用程序的一部分需要模拟鼠标移动和鼠标点击。我目前通过使用CGEvent发布CGEventPost(kCGHIDEventTap, event);个对象来执行此操作。

这在很大程度上起作用 - 我可以模拟鼠标移动和点击很好,但在某些方面似乎失败了。例如:

  • 在Mozilla Firefox和Safari中,我可以点击所有菜单,但无法点击网站中的链接。当我尝试时,链接突出显示,但浏览器从不跟随链接。但是,我可以右键单击一个链接,选择“在新选项卡中打开链接”,一切都按预期工作。 已解决 - 使用CGEventCreateMouseEvent(...)创建鼠标事件会使事件在网络浏览器中正常运行。
  • 我可以点击“仪表板”图标以显示仪表板,但我无法点击任何仪表板小部件上的“i”按钮。同样,点击聚光灯搜索小部件中的任何搜索结果也不起作用。

这种不一致是应用程序的边界。可能是什么原因?

4 个答案:

答案 0 :(得分:5)

要说服这些应用程序实际生成单击的操作,您需要做的是将鼠标向上事件中“单击状态”字段的值显式设置为1(默认为0)。以下代码将执行此操作:

CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1);

鼠标按下也必须设置为1,但是使用CGEventCreateMouseEvent()而不是CGEventCreate()可以为你完成。

我已经对此进行了测试,它可以在信息中心的“i”按钮和Spotlight搜索结果中使用。

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

答案 1 :(得分:1)

大多数菜单都是使用mouseDown事件激活的。 mouseUp事件后跟踪超链接。 “i”按钮仅在单击鼠标但不是很长时间时有效。 所有这些似乎表明你有一个计时问题,尝试几个按下时间。

答案 2 :(得分:0)

使用OSXVnc。我看到他们使用CGPostMouseEvent()代替CGPostEvent()

答案 3 :(得分:0)

我已经在博客文章 Python Mouse Click and Move Mouse on Apple Mac OS X Snow Leopard 10.6.x 中写了如何做到这一点。