objective-c - addGlobalMonitorForEventsMatchingMask 只返回鼠标位置

标签 objective-c cocoa macos

我正在尝试学习为 Mac 编写代码。我使用 Java 已有一段时间了,所以我希望我遇到的问题是对 Cocoa 的简单误解。

我有以下代码:

-(IBAction)beginEventMonitor:(id)sender {
  _eventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseUpMask)
  handler:^(NSEvent *incomingEvent) {
    //NSWindow *targetWindowForEvent = [incomingEvent window];
    NSLog(@"Got a mouse click event at %@", NSStringFromPoint([incomingEvent locationInWindow]));
    }];
}

-(IBAction)stopEventMonitor:(id)sender {
  if (_eventMonitor) {
    [NSEvent removeMonitor:_eventMonitor];
    _eventMonitor = nil;
  }
}

这是一个简单的钩子(Hook),可以在全局级别发生鼠标单击时告诉我。处理程序正在工作,但 incomingEvent 的内容似乎没有设置为任何内容。我能找到的唯一有用的信息是鼠标在单击时的位置,以及单击的窗口的 windowId。

我不应该能够获得更多信息吗?我没有正确设置显示器吗?我真的很想知道点击了哪个窗口,但我什至找不到将鼠标位置或 windowId 变成有用的东西的方法。

最佳答案

您可以使用 CGWindow API(Leopard 中的新功能)检索有关窗口的更多信息,例如:

CGWindowID windowID = (CGWindowID)[incomingEvent windowNumber];
CFArrayRef a = CFArrayCreate(NULL, (void *)&windowID, 1, NULL);
NSArray *windowInfos = (NSArray *)CGWindowListCreateDescriptionFromArray(a);
CFRelease(a);
if ([windowInfos count] > 0) {
    NSDictionary *windowInfo = [windowInfos objectAtIndex:0];
    NSLog(@"Name:  %@", [windowInfo objectForKey:(NSString *)kCGWindowName]);
    NSLog(@"Owner: %@", [windowInfo objectForKey:(NSString *)kCGWindowOwnerName]);
    //etc.
}
[windowInfos release];

那里有很多信息(查看 CGWindow.h 或引用文档以获取可用键)。还有一些功能可以只创建一个窗口的屏幕截图(如果它被另一个窗口部分覆盖,它甚至可以工作),很酷的东西!

关于objective-c - addGlobalMonitorForEventsMatchingMask 只返回鼠标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4702632/

相关文章:

objective-c - 为渐变位置创建 CGFloat 数组

cocoa - 如果删除第一个元素,NSMutableArray 是否会移动其元素?

java - 应用程序应将其日志存储在 Mac OS 中的什么位置?

javascript - "Resource interpreted as script but transferred with MIME type text/html."

git - 推送到位于 RDP 客户端上的 git 存储库

objective-c - NSString Initwithformat :arguments: 的限制

objective-c - 尝试将 Obj-C 代码移植到 Swift 以检查字典中是否存在键以及值是否具有正确的类型

objective-c - capitalizedString 不能正确大写以数字开头的单词?

ios - (NSDictionary<NSString *,id> * __nonnull) 是什么意思?

cocoa - OSX 应用程序的 TDD