Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在Mac Cocoa应用程序中实现快捷键输入?_Objective C_Macos_Cocoa_Shortcuts - Fatal编程技术网

Objective c 如何在Mac Cocoa应用程序中实现快捷键输入?

Objective c 如何在Mac Cocoa应用程序中实现快捷键输入?,objective-c,macos,cocoa,shortcuts,Objective C,Macos,Cocoa,Shortcuts,我需要在我的Cocoa应用程序中创建一个全局热键输入框 我知道捷径录音机,但它是一个非常古老的解决方案。它的一些部分是使用Carbon实现的,这已经被弃用,如果我使用它,我不能将我的应用发布到Mac应用商店 有现成的现代解决方案吗?有谁能告诉我自己做这件事的方法吗(我不知道从哪里开始)?在Mac OS X 10.6及更高版本中,您可以使用从NSEvent类定义的方法。报告以下信息: 本地和全局事件监视器是互斥的。例如,全局监视器不观察安装它的应用程序的事件流。本地事件监视器仅观察其应用程序的事件

我需要在我的Cocoa应用程序中创建一个全局热键输入框

我知道捷径录音机,但它是一个非常古老的解决方案。它的一些部分是使用Carbon实现的,这已经被弃用,如果我使用它,我不能将我的应用发布到Mac应用商店


有现成的现代解决方案吗?有谁能告诉我自己做这件事的方法吗(我不知道从哪里开始)?

在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建议):

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

并非所有的碳元素都被弃用,只有GUI部分。虽然这会起作用,但这是一条艰难的道路。Carbon Event Manager的API对此仍然是受支持的,而且更简单、更容易,两个第三方Cocoa包装器使其更加容易。除非应用程序的可访问性受信任,否则这对关键事件不起作用全局监视器不起作用,但在本地,我可以让它监听密钥关闭。但是我假设人们正在寻找一个全局热键:)。需要注意的另一个问题是,使用这种方法的一些键命令仍然会触发“Funk”错误声音。有人知道阻止这一切的方法吗?@kiamlaluno谢谢你明确的回答。行了,谢谢你,彼得!但我知道如何注册热键。对我来说很简单。我想记录用户的密钥,所以我需要在“首选项”窗口中实现类似“热键NSTextField”的功能。@VictorShcherbakov:ShortcutRecorder仍然是我所知道的最好的方法。它应该是64位兼容的,至少在主干版本中是这样。shortcutrecorder(演示应用程序)在lion+xcode4上对我不起作用。所以我还是很高兴听到除了shortcutrecorder(他创建的)之外的其他输入字段选项。这是否只适用于其他应用程序中不存在的快捷方式?我在注册快捷方式时遇到问题,其中一个是我在另一个应用程序中看到的。另外,如果我更改了默认快捷键,它将不起作用,并且当我的应用程序运行时,不是修改键的键在任何应用程序中都不起作用。我想抓住cmd+c和alt+cmd+v