【问题标题】:Simulated MouseEvent not working properly OSX模拟 MouseEvent 无法正常工作 OSX
【发布时间】:2013-02-18 02:51:34
【问题描述】:

早在 2010 年,Pierre 提出了this 的问题(他接受的答案对我不起作用)。

我遇到了同样的问题:我可以通过 Cocoa 应用程序以编程方式成功地在屏幕上移动(和关闭!?!)鼠标,但是将鼠标移到我的扩展坞位置并没有显示它(以及其他一些应用程序没有注册鼠标移动事件,例如移除鼠标的游戏)

我使用的方法是这样的:

void PostMouseEvent(CGMouseButton button, CGEventType type, const CGPoint point)
{
  CGEventRef theEvent = CGEventCreateMouseEvent(NULL, type, point, button);
  CGEventSetType(theEvent, type);
  CGEventPost(kCGSessionEventTap, theEvent);
  CFRelease(theEvent);
}

然后当我想移动鼠标时,我运行:

PostMouseEvent(0, kCGEventMouseMoved, mouseLocation);

请注意,此代码确实会为链接等内容生成鼠标悬停事件。

现在是 2013 年,是否有可能解决此问题?

感谢您的宝贵时间!

【问题讨论】:

    标签: macos cocoa mouseevent mouseover simulation


    【解决方案1】:

    我会扭曲光标并生成鼠标移动事件。例如,我从经验中知道,虽然光标本身不会生成事件,但它会修改随后的鼠标移动事件以将移动的距离包含在其鼠标增量中。我不知道您的合成移动事件是否会单独包含正确的增量值。

    【讨论】:

    • 在 PostMouseEvent 方法的底部添加 CGWarpMouseCursorPosition(point); 没有帮助 - 这是您的意思吗?
    • 如果鼠标碰到屏幕边缘,添加它会将鼠标传送到 (0,0)。
    • 好吧,我会在发布事件之前进行变形,因为变形会为下一个事件添加增量。如果那不是您指定的点,则无法告诉您为什么它会转到 (0, 0)。
    • 将经线直接放在CGEventPost(kCGSessionEventTap, theEvent); 之前会阻止鼠标传送到(0,0),但是停靠栏仍然没有显示,现在如果鼠标碰到它,鼠标就会粘在屏幕边缘...将扭曲添加到方法的顶部会停止鼠标粘着,但仍然不显示停靠...
    • 啊,粘住是/是由于鼠标实际上从屏幕上移开,但扭曲使它看起来好像还在屏幕上......
    【解决方案2】:

    好的,显然 MacOSX 需要鼠标正好位于屏幕边缘才能显示 Dock! 因为我将我的 Dock 放在屏幕的左侧(由于许多程序将重要按钮保留在其窗口的底部),所以我所要做的就是说

    if (mouseLocation.x < 0)
    {
        mouseLocation.x = 0;
    }
    

    它奏效了!

    我也在使用 KenThomases 的想法来扭曲光标。

    (这个答案被标记为正确,因为它允许我显示 Dock - 但是仍然有一些应用程序没有响应鼠标输入)

    【讨论】:

    • 您应该考虑屏幕的其他边缘。同样,在多显示器的情况下,屏幕的原点也可能有负分量。
    • 是的,会的。好的,我不知道额外的显示器...谢谢! (我的项目将使用额外的显示器......幸运的是你告诉我!)
    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多