如何使用Cocoa获取键值,无论是否关注窗口

时间:2011-01-05 22:50:02

标签: cocoa macos focus

当我不关注窗口时,我想通过Cocoa获得关键值。 如果你知道,请教我。

3 个答案:

答案 0 :(得分:3)

如果我理解了这个问题,您想知道何时按下某个键,即使您的应用程序/窗口不是最前面的窗口?

如果是这种情况,您可以使用+[NSEvent addGlobalMonitorForEventsMatchingMask:handler:](仅限10.6+)或使用CGEventTap

答案 1 :(得分:1)

要使用addGlobalMonitorForEventsMatchingMask或CGEventTap,您的应用程序将需要以root身份运行。我无法让NSEvent方法适合我,但是CGEventTap却以root身份被罚款。

CGEventTap方法的优点是:

  • 您收到所有活动,甚至是您自己申请的活动。 (另一种方法不会向您发送您自己的活动。)
  • 您可以点击各个级别的事件(在窗口服务器之前,在会话服务器之前等)
  • 如果需要,您可以修改事件。

答案 2 :(得分:0)

我最近asked this question使用了addGlobalMonitorForEventsMatchingMask,正如Dave Delong建议的那样,@ NSGod向我指出。

我很难搞清楚块语法,所以我将引用我发布到该答案的代码:

      // register for keys throughout the device...
   [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(struct NSEvent *event){

    NSString *chars = [[event characters] lowercaseString];
    unichar character = [chars characterAtIndex:0];

    NSLog(@"keydown globally! Which key? This key: %c", character);

    }];

用块来记住的是它们直接提供给方法调用。我在my own question附加了一个更全面的描述,但是如果您按照上面的语法并将块视为一种“内联委托方法”,那么您应该做得很好。