在Cocoa中观察屏幕上的全局鼠标位置?

时间:2012-08-24 21:50:42

标签: objective-c cocoa nswindow nsevent

我想在鼠标移动并获得屏幕上的位置时收到通知。我试过这个:

[NSEvent addGlobalMonitorForEventsMatchingMask:NSMouseMovedMask handler:^(NSEvent *event) {
    CGPoint location = [NSEvent mouseLocation];
    NSLog(@"Position: %@", NSStringFromPoint(location));
}];

然而,只要鼠标在我的应用程序窗口中,这似乎才有效。一离开,我就不会得到通知。直到我再次进入窗口。这个事件不应该是全球性的吗?

更新

我提取了有问题的代码并制作了一个单独的示例项目(Dropbox-Link)。可以肯定的是,没有其他任何东西可以干扰它。这是一个干净的项目,只有applicationDidFinishLaunching:中的代码。我得到了相同的结果,这真的很奇怪。我向youtube上传了一个视频:http://www.youtube.com/watch?v=I3AKgmURaMk

这些是我的观察:

  1. 启动应用程序后,无论我在何处移动鼠标,都不会发送任何事件。
  2. 单击应用程序窗口将以某种方式激活事件传递。现在我收到NSMouseMovedMask事件,无论我在哪里移动鼠标(这都是我想要实现的)。
  3. 点击返回Xcode不会改变任何内容。我一直在接受这些活动。
  4. 但是,将焦点移回我的应用程序会导致奇怪的行为。当我将鼠标移到Xcode上时,我只在窗口的某些部分上获取事件,而某些部分似乎吸收了该事件。更具体地说,我没有通过编辑器或日志视图接收事件。我只在鼠标移动到灰色分割视图分隔符区域(其中嵌入了标签栏)时才接收它们。

1 个答案:

答案 0 :(得分:1)

它应该工作,我看到窗口启动但不在前台时的奇怪行为。我注意到,如果应用程序在后台但不在Dock中,那么当鼠标在前景中的窗口之间转换时,您将只获得事件。最小化应用程序似乎解决了这个问题..我在cocoa dev / ObjC上很新...我可能错了,但我注意到当我最小化我的应用程序时,我得到所有事件。