addGlobalMonitorForEventsMatchingMask仅返回鼠标位置

时间:2011-01-15 22:56:37

标签: 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;
  }
}

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

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

1 个答案:

答案 0 :(得分:6)

您可以使用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或参考文档获取可用的密钥)。还有一些功能可以创建一个窗口的屏幕截图(如果它被另一个窗口部分覆盖,它甚至可以工作),很酷的东西!