【问题标题】:Simulating mouse clicks on Mac OS X does not work for some applications在 Mac OS X 上模拟鼠标点击不适用于某些应用程序
【发布时间】:2011-09-08 03:21:39
【问题描述】:

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

这在大多数情况下都有效 - 我可以很好地模拟鼠标移动和点击,但它似乎在某些方面失败了。例如:

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

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

【问题讨论】:

    标签: c++ macos events mouse


    【解决方案1】:

    要让这些应用程序相信您确实生成了一次点击,您需要做的是明确将鼠标向上事件的“点击状态”字段的值设置为 1(默认为 0)。下面的代码会做到这一点:

    CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1);
    

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

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

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

    【讨论】:

      【解决方案2】:

      大多数菜单都是通过 mouseDown 事件激活的。在 mouseUp 事件之后跟随超链接。 “i”按钮仅在单击鼠标但时间不长时才起作用。 这一切似乎说明你有计时问题,多试几次按下计时。

      【讨论】:

      • 这听起来很有希望。我刚刚计算了发送鼠标向下和鼠标向上事件之间的时间间隔 - 典型的点击需要 42 毫秒,在我看来这应该足够短以生成点击事件而不是点击并按住或其他什么...
      • 确实,这不是时间问题。只要您设置点击次数,任何合理的时机都可以。
      【解决方案3】:

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

      【讨论】:

      • CGPostMouseEvent 已在 10.6 中弃用。感谢您的建议,但我宁愿不使用已弃用的功能。
      • CGPostMouseEvent() 已替换为 CGEventCreateMouseEvent()。为什么不使用它? developer.apple.com/mac/library/documentation/Carbon/Reference/…
      • 从 CGEventCreate() 更改为 CGEventCreateMouseEvent() 已修复了 firefox 问题 - 这很奇怪,毕竟我设置了相同的参数,但不是仪表板问题。
      • ...无论您使用哪个函数创建事件,您仍然需要使用 CGPostEvent() 发布...
      • 它起作用的原因是 CGEventCreate() 将点击状态设置为 0always,而 CGEventCreateMouseEvent() 将鼠标按下设置为 1,鼠标向上设置为 0。所以它解决了部分问题。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 2011-03-25
        • 2017-06-13
        • 1970-01-01
        • 1970-01-01
        • 2012-08-07
        相关资源
        最近更新 更多