如何在Mac Cocoa App中实现快捷键输入?

时间:2011-11-20 11:59:16

标签: objective-c macos cocoa shortcuts

我需要在我的Cocoa App中创建一个全局热键输入框。

我知道Shortcut Recorder,但它是一个非常古老的解决方案。它有使用Carbon实现的部分,已被弃用,如果我使用它,我无法将我的应用程序发布到Mac App Store。

是否有现成的现代化解决方案?任何人都可以给我自己做这个的方法(我不知道从哪里开始)?

3 个答案:

答案 0 :(得分:14)

有一个名为MASShortcut的现代框架,用于在OS X 10.7 +中实现全局快捷方式。

答案 1 :(得分:13)

在Mac OS X 10.6及更高版本中,您可以使用NSEvent类定义的方法+addGlobalMonitorForEventsMatchingMask:handler:+addLocalMonitorForEventsMatchingMask:handler:Monitoring Events报告以下信息:

  

本地和全球事件监视器是互斥的。例如,全局监视器不会观察安装它的应用程序的事件流。本地事件监视器仅观察其应用程序的事件流。要监视来自所有应用程序(包括“当前”应用程序)的事件,您必须安装两个事件监视器。

该页面中显示的代码用于本地事件监视器,但全局事件监视器的代码类似;调用NSEvent的方法有什么变化。

_eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:
        (NSLeftMouseDownMask | NSRightMouseDownMask | NSOtherMouseDownMask | NSKeyDownMask)
        handler:^(NSEvent *incomingEvent) {
    NSEvent *result = incomingEvent;
    NSWindow *targetWindowForEvent = [incomingEvent window];
    if (targetWindowForEvent != _window) {
        [self _closeAndSendAction:NO];
    } else if ([incomingEvent type] == NSKeyDown) {
        if ([incomingEvent keyCode] == 53) {
            // Escape
            [self _closeAndSendAction:NO];
            result = nil; // Don't process the event
        } else if ([incomingEvent keyCode] == 36) {
            // Enter
            [self _closeAndSendAction:YES];
            result = nil;
        }
    }
    return result;
}];

一旦监视器不再需要,您可以使用以下代码将其删除:

[NSEvent removeMonitor:_eventMonitor];

答案 2 :(得分:13)

并非所有Carbon都被弃用。你不能再制作一个纯碳应用程序了,但有些API仍在使用,其中一些仍然是做某些事情最简单的方法。

其中一个是Carbon Events热键API。您当然可以使用NSEvent的事件监视器方法筛选所有事件,但这是不必要的工作。 Carbon Events热键API仍然受支持且更简单 - 您只需告诉它要匹配的键和按下键时要调用的函数。还有像DDHotKey这样的Cocoa包装器使它更简单。