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

rad*_*dex 18 macos cocoa core-foundation

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

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

抱歉我的英语 - 我希望你明白我的意思;)

Mat*_* S. 32

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

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


Dav*_*ong 29

Matt S.是正确的,如果你可以使用NSEventAPI来获取鼠标位置.但是,您不必轮询以便连续获取坐标.你可以用一个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;
}
Run Code Online (Sandbox Code Playgroud)

这样,myCGEventCallback每次鼠标移动时,您的功能都会触发(无论您的应用程序是否位于最前端),而无需轮询信息.不要忘记CGEventTapEnable(eventTap, false),CFRelease(eventTap)当你完成时.

  • 根据[文档](https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventTapCreate),`kCGHIDEventTap`需要root权限,这可能就是为什么它不适合你.您可能想要使用`kCGSessionEventTap`. (3认同)

小智 6

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

CGEventRef event = CGEventCreate(nil);
CGPoint loc = CGEventGetLocation(event);
CFRelease(event);
Run Code Online (Sandbox Code Playgroud)

作品.