Objective c 如何在Mac Cocoa应用程序中实现快捷键输入?
我需要在我的Cocoa应用程序中创建一个全局热键输入框 我知道捷径录音机,但它是一个非常古老的解决方案。它的一些部分是使用Carbon实现的,这已经被弃用,如果我使用它,我不能将我的应用发布到Mac应用商店Objective c 如何在Mac Cocoa应用程序中实现快捷键输入?,objective-c,macos,cocoa,shortcuts,Objective C,Macos,Cocoa,Shortcuts,我需要在我的Cocoa应用程序中创建一个全局热键输入框 我知道捷径录音机,但它是一个非常古老的解决方案。它的一些部分是使用Carbon实现的,这已经被弃用,如果我使用它,我不能将我的应用发布到Mac应用商店 有现成的现代解决方案吗?有谁能告诉我自己做这件事的方法吗(我不知道从哪里开始)?在Mac OS X 10.6及更高版本中,您可以使用从NSEvent类定义的方法。报告以下信息: 本地和全局事件监视器是互斥的。例如,全局监视器不观察安装它的应用程序的事件流。本地事件监视器仅观察其应用程序的事件
有现成的现代解决方案吗?有谁能告诉我自己做这件事的方法吗(我不知道从哪里开始)?在Mac OS X 10.6及更高版本中,您可以使用从
NSEvent
类定义的方法。报告以下信息:
本地和全局事件监视器是互斥的。例如,全局监视器不观察安装它的应用程序的事件流。本地事件监视器仅观察其应用程序的事件流。要监视来自所有应用程序(包括“当前”应用程序)的事件,必须同时安装两个事件监视器
该页面中显示的代码用于本地事件监视器,但用于全局事件监视器的代码类似;所调用的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];
并非所有的碳都被弃用。你不能再制作纯碳应用程序了,但有些API仍然存在,其中一些仍然是做某些事情的最简单方法 其中之一就是碳事件热键API。当然,您可以使用NSEvent的事件监视器方法筛选所有事件,但这是不必要的工作。Carbon Events热键API仍然受支持,而且更简单,只要告诉它要匹配的键以及按下该键时要调用的函数即可。还有像DDHotKey这样的可可包装使它更简单
- ,相关的碳事件功能(另请参见同一文档中的Unregisterevent热键)
- ,另一个包装
- MASShortcut,另一种包装(由Tong建议):