我怎样才能进入Mac OS X“全局”鼠标位置 - 我的意思是我怎样才能在cocoa / cf /中查找光标位置,即使它在窗外,即使我的窗口处于非活动状态?
我知道它在某种程度上是可能的(即使没有管理员权限),因为我在Java中看到过类似的东西 - 但我想在ObjC中编写它
对不起我的英语 - 我希望你明白我的意思;)
答案 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