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

Tho*_*omi 7 c++ macos mouse events

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

这在很大程度上是有效的 - 我可以模拟鼠标移动和点击很好,但在某些方面似乎失败了.例如:

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

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

Nic*_*ore 6

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

CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1);
Run Code Online (Sandbox Code Playgroud)

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

我已对此进行了测试,它可以在仪表板中的"i"按钮和Spotlight搜索结果中使用.

(另外,如果您正在模拟双击,则需要将鼠标按下和鼠标按下事件的点击状态设置为2.)