使用`CGEventSourceSetLocalEventsSuppressionInterval`代替不推荐使用的`CGSetLocalEventsSuppressionInterval`

时间:2012-04-17 18:08:05

标签: objective-c macos cocoa macos-carbon

以编程方式移动鼠标光标时,必须将CGSetLocalEventsSuppressionInterval设置为0,以便事件实时进入而不是250毫秒延迟。

不幸的是,在{Snow}中,CGSetLocalEventsSuppressionInterval被标记为已弃用。

另一种选择是CGEventSourceSetLocalEventsSuppressionInterval(CGEventSourceRef source, CFTimeInterval seconds); https://developer.apple.com/library/mac/#documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventSourceSetLocalEventsSuppressionInterval

-(void) mouseMovement:(CGEventRef) newUserMouseMovement
{
    //Move cursor to new position
    CGSetLocalEventsSuppressionInterval(0.0); //Deprecated in OS X 10.6
    CGWarpMouseCursorPosition(NSPointToCGPoint(newMousePosition));
    CGSetLocalEventsSuppressionInterval(0.25); //Deprecated in OS X 10.6

    //--OR--//

    CGEventSourceRef source = ???;
    CGEventSourceSetLocalEventsSuppressionInterval(source, 0.0);
    CGWarpMouseCursorPosition(NSPointToCGPoint(newMousePosition));
    CGEventSourceSetLocalEventsSuppressionInterval(source, 0.25);
}

我不能让后一种方法起作用。

所以我想我的问题是如何获得该功能所需的CGEventSourceRef

它是用户正常鼠标移动的事件源吗?或者我手动变形光标?

2 个答案:

答案 0 :(得分:4)

事件来源似乎没有在任何地方解释,也没有人知道如何使用它们。

CGPoint warpPoint = CGPointMake(42, 42);
CGWarpMouseCursorPosition(warpPoint);
CGAssociateMouseAndMouseCursorPosition(true);

在warp调用之后立即调用CGAssociateMouseAndMouseCursorPosition(true),以使Quartz事件系统降低此特定warp的延迟。

答案 1 :(得分:3)

你有没有解决过这个问题?

您是否尝试过使用CGEventCreateSourceFromEvent(...)从CGEventRef创建CGEventSourceRef?