Objective-C:监听键盘快捷键并执行相应动作。

6

我正在开发一个Mac OS X的应用程序,需要监听键盘快捷输入以便对它们进行操作。

例如:

  • 向上向下 键在表格视图中上下移动。
  • + 删除一个项目。
  • + + N 创建一个新项目。

它不应该局限于聚焦控件上的事件。

有什么想法吗?

提前致谢。

3个回答

8
我认为你最好的选择*是使用+[NSEvent addLocalMonitorForEventsMatchingMask:handler:]。这将创建一个对象,每当您的应用程序接收到指定类型的事件时,它都会调用一个块处理程序。处理将在您的NSApplication将事件分派到窗口之前进行,并且您有机会修改事件或停止其进一步进行。
因此,您可以捕获键按下事件,因为它们被传递给您的应用程序,并在任何控件有机会查看它们之前对它们进行任何操作。我最初在另一个问题中发布了这个,但这里是一个处理箭头键按下事件的片段:
NSEvent * (^monitorHandler)(NSEvent *);
monitorHandler = ^NSEvent * (NSEvent * theEvent){

    switch ([theEvent keyCode]) {
        case 123:    // Left arrow
            NSLog(@"Left behind.");
            break;
        case 124:    // Right arrow
            NSLog(@"Right as always!");
            break;
        case 125:    // Down arrow
            NSLog(@"Downward is Heavenward");
            break;
        case 126:    // Up arrow
            NSLog(@"Up, up, and away!");
            break;
        default:
            break;
    }
    // Return the event, a new event, or, to stop 
    // the event from being dispatched, nil
    return theEvent;
};

// Creates an object we do not own, but must keep track of so that 
// it can be "removed" when we're done; therefore, put it in an ivar.
eventMon = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask 
                                                 handler:monitorHandler];

请参考事件处理指南,了解有关监视器对象的详细信息。具体地说,苹果公司似乎“不建议”在dealloc中删除它,但没有给出理由。
*只要你可以要求雪豹版本。

在ARC下,不需要担心释放内存的问题吗? - Just a coder
事件监视器对象的生命周期将像其他对象一样被处理。我不认为在dealloc中删除它的警告已经改变了。 - jscs

3

你可能需要在你的应用程序中实现回调函数。可以查看CGEventTapCreate来开始监听热键。

CGEventTapCreate(kCGSessionEventTap,
             kCGTailAppendEventTap,
             kCGEventTapOptionDefault,
             kCGEventKeyDown
             myEventTapCallback,
             NULL);

myEventTapCallback应符合CGEventTapCallBack,当按下键时会调用该回调函数。在myEventTapCallback内部,您将获得足够的按键信息,并可以实现自定义功能。


2
请查看Cocoa事件处理指南。在关键视图之前,您可以在几个位置拦截事件。您可以通过覆盖-[NSApplication sendEvent:]来拦截应用程序中的所有事件,或者通过覆盖-[NSWindow sendEvent:]来拦截每个窗口级别的事件。请注意保留HTML标签。

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