在Mac OS X中获得“全局”鼠标位置

时间:2010-02-14 19:55:49

标签: cocoa macos core-foundation

我怎样才能进入Mac OS X“全局”鼠标位置 - 我的意思是我怎样才能在cocoa / cf /中查找光标位置,即使它在窗外,即使我的窗口处于非活动状态?

我知道它在某种程度上是可能的(即使没有管理员权限),因为我在Java中看到过类似的东西 - 但我想在ObjC中编写它

对不起我的英语 - 我希望你明白我的意思;)

5 个答案:

答案 0 :(得分:31)

NSPoint mouseLoc;
mouseLoc = [NSEvent mouseLocation]; //get current mouse position
NSLog(@"Mouse location: %f %f", mouseLoc.x, mouseLoc.y);

如果您希望它连续获取坐标,请确保您拥有NSTimer或类似的东西

答案 1 :(得分:29)

Matt S.是正确的,如果您可以使用NSEvent API获取鼠标位置。但是,您不必轮询以便连续获取坐标。您可以改为使用CGEventTap

- (void) startEventTap {
    //eventTap is an ivar on this class of type CFMachPortRef
    eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
    CGEventTapEnable(eventTap, true);
}

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
    if (type == kCGEventMouseMoved) {
        NSLog(@"%@", NSStringFromPoint([NSEvent mouseLocation]));
    }

    return event;
}

这样,每次鼠标移动时,您的函数myCGEventCallback都会触发(无论您的应用程序是否在最前面),而无需轮询信息。完成后不要忘记CGEventTapEnable(eventTap, false)CFRelease(eventTap)

答案 2 :(得分:6)

如果你不在可可土地并且事件发生不适合这种情况,

CGEventRef event = CGEventCreate(nil);
CGPoint loc = CGEventGetLocation(event);
CFRelease(event);

作品。

答案 3 :(得分:3)

马特是正确的,但为了不断获得坐标,我相信另一个选择是使用NSEvent提供的事件监视器。试试addGlobalMonitorForEventsMatchingMask:handler:addLocalMonitorForEventsMatchingMask:handler:。请查看NSEvent Class Reference以获取更多详细信息。

答案 4 :(得分:1)

对于全局游标位置的连续更新,代码如下所示(Swift 4.0.3):

override func viewDidLoad()
{
    super.viewDidLoad()

    NSEvent.addGlobalMonitorForEvents(matching: NSEvent.EventTypeMask.mouseMoved, handler: {(mouseEvent:NSEvent) in
        let position = mouseEvent.locationInWindow
    })
}

注意,变量'位置'是一个带有x和y坐标的NSPoint对象(在许多其他属性中)。如果您的应用程序处于焦点或单击并拖动时,这将不会返回坐标。所有这些都有单独的事件:只需将NSEvent.EventTypeMask.mouseMoved更改为不同的EventTypeMask