mik*_*wan 6 macos keyboard-shortcuts objective-c
我正在为Mac OS X开发一个应用程序,我需要听键盘快捷键输入,以便我可以对它们采取行动.
例如:
它不应局限于聚焦控制上的事件.
有任何想法吗?
提前致谢.
我认为你最好的选择是*+[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.
查看Cocoa 事件处理指南。有几个地方可以在事件到达关键视图之前拦截它们。您可以通过重写来拦截应用程序中的所有事件-[NSApplication sendEvent:],也可以通过重写来拦截每个窗口级别的事件-[NSWindow sendEvent:]。