1

我正在编写一个 Cocoa 应用程序,我想实现一个全局热键功能。我从 Waffle Software 实现了 ShortcutRecorder.framework,并在我的 xib 中添加了一个 customView。然后我将CustomView 子类化为SRRecorderControl。现在我在我的窗口中看到了记录器,但是我怎样才能获得 KeyCombo 以及我该如何应对呢?

我实现了 keyComboDidChange 方法,但没有获得密钥代码。我究竟做错了什么?

这是我获取密钥代码的代码:

- (void)shortcutRecorder:(SRRecorderControl *)aRecorder keyComboDidChange:(KeyCombo)newKeyCombo
{
    if (aRecorder == shortcutRecorder)
    {
        NSLog{"We got a new Key Combo");
    }
}

顺便说一句,shortcutrecorder 是我的 IBOutlet。

我是否必须实现协议或 setDelegate:self 或类似的东西?

编辑添加

实际上我已经在我的 Preferences.h 中声明了我的 shortcutRecorder 出口。然后在身份检查器中,我将“首选项”作为文件所有者的自定义类放入,并将委托连接到我的快捷方式记录器……但从未调用过 keyComboDidChange……我不明白为什么。

4

2 回答 2

1

让我解释一下我为使其工作而采取的步骤:

  • 创建一个窗口xib
  • 就我而言,该类的文件所有者是 PreferencesWindowController
  • 通过右键单击窗口并将其拖动到文件所有者,创建从窗口到文件所有者的引用出口
  • 将自定义视图添加到您的窗口
  • 您必须将 ShortcutRecorder 的代表连接到“文件的所有者”。为此,右键单击 SRRecorderControl 并将委托拖到左侧的“文件所有者”。

在此之后:ShortcutRecorder 只记录热键并将其留给您如何处理。您需要使用 PTHotKeyCenter(随 ShortcutRecorder 提供),或者您可以自己实现快捷方式处理。

ShortcutRecorder 包含一个很棒的演示,演示了 ShortcutRecorder 与 PTHotKeyCenter 的结合使用。它是这样工作的:

  • 收听 ShortcutRecorder 中的事件(您已经这样做了,但没有设置委托)
  • 检查是否设置了 globalHotKey 变量
  • 如果是这样,请卸载以前的热键
  • 使用 ShortcutRecorder 中的设置初始化一个新的热键
  • 设置目标和动作以实际捕获热键,一旦按下
  • 将热键保存到共享中心(从这一刻起,热键将起作用)

小样本,来自他们的来源:

if (globalHotKey != nil)
{
    [[PTHotKeyCenter sharedCenter] unregisterHotKey: globalHotKey];
    [globalHotKey release];
    globalHotKey = nil;
}

globalHotKey = [[PTHotKey alloc] initWithIdentifier:@"SRTest"
                                           keyCombo:[PTKeyCombo keyComboWithKeyCode:[shortcutRecorder keyCombo].code
                                                                          modifiers:[shortcutRecorder cocoaToCarbonFlags: [shortcutRecorder keyCombo].flags]]];

[globalHotKey setTarget: self];
[globalHotKey setAction: @selector(hitHotKey:)];

[[PTHotKeyCenter sharedCenter] registerHotKey: globalHotKey];

剩下要做的就是热键处理程序:

- (void)hitHotKey:(PTHotKey *)hotKey
{
    NSLog(@"Hotkey pressed!");
}

您可以轻松地将热键设置保存到 UserDefaults 以在每次应用程序启动时加载它们。

于 2011-10-22T08:17:12.783 回答
0

实际上我已经在我的 Preferences.h 中声明了我的 shortcutRecorder 出口。然后在身份检查器中,我将“首选项”作为文件所有者的自定义类放入,并将委托连接到我的快捷方式记录器......但从未调用过 keyComboDidChange......我不明白为什么-.-

于 2011-10-22T15:06:22.120 回答