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

4

我希望在鼠标移动时得到屏幕上的位置并收到通知。我尝试了以下方法:

[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上时,我只能在窗口的某些部分接收到事件,而其他部分似乎吸收了事件。更具体地说,我不能在编辑器或日志视图上接收事件。只有在灰色分割视图分隔符区域(嵌入选项卡栏的区域)移动鼠标时才会收到它们。

是的,它应该在您的应用程序之外工作,我不知道为什么它对您没有起作用。如果您想查看鼠标移动(而不是拖动),请尝试使用NSMouseMovedMask。在我的手中,它直到我在应用程序内或外单击某个地方才开始监视。 - rdelmar
你确定那段代码正在运行吗?(使用NSLog或断点) - TheAmateurProgrammer
@rdelmar 抱歉,我实际上是在使用NSMouseMovedMask。我已经修复了。theAmateurProgrammer 是的,我记录了它。事件监视器已添加。但它似乎会随机停止工作。我认为这可能是当我将鼠标移动到某些其他窗口时发生的,比如Xcode或Messages。移动鼠标到壁纸上是可以注册的。非常奇怪。 - DrummerB
我尝试了你的代码,我没有看到这些问题,在Xcode上它可以正常工作。 - rdelmar
你的测试应用程序在我的Mountain Lion上似乎可以工作。但是你是否注意到文档中说“对于发送到您自己的应用程序的事件,将不会调用您的处理程序”? - JWWalker
在Mavericks上完美运行。 - Jorge Vega Sánchez
1个回答

1

它应该能够正常工作,我曾经看到过窗口在后台时出现奇怪行为的情况。我注意到,如果应用程序在后台但不在 dock 中,您只会在鼠标在前台窗口之间转换时才会收到事件。最小化应用程序似乎可以解决这个问题。我非常新于 Cocoa 开发 / ObjC.. 我可能是错误的,但我注意到当我最小化我的应用程序时,我会收到所有事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接