Objective-C:收听键盘快捷键并对其进行操作

mik*_*wan 6 macos keyboard-shortcuts objective-c

我正在为Mac OS X开发一个应用程序,我需要听键盘快捷键输入,以便我可以对它们采取行动.

例如:

  • Updown键在表格视图上上下移动.
  • + 放下一个项目.
  • + + N创建一个新项目.

它不应局限于聚焦控制上的事件.

有任何想法吗?

提前致谢.

Jos*_*ell 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];
Run Code Online (Sandbox Code Playgroud)

有关您应该对该监视器对象执行的操作的一些详细信息,请参阅" 事件处理指南".具体来说,苹果显然"劝阻"将其删除dealloc,但没有理由.


*至少你可以要求Snow Leopard.


Tom*_*ing 2

查看Cocoa 事件处理指南。有几个地方可以在事件到达关键视图之前拦截它们。您可以通过重写来拦截应用程序中的所有事件-[NSApplication sendEvent:],也可以通过重写来拦截每个窗口级别的事件-[NSWindow sendEvent:]