1

我正在寻找拦截命令组合键并认为这IMKit是一个不错的选择。通过扩展,IMKInputController我可以拦截大多数键,但它似乎忽略了修改过的键。

我试过覆盖

-(BOOL)inputText:(NSString*)string client:(id)sender;

和(或者)

-(BOOL)inputText:(NSString*)string 
             key:(NSInteger)keyCode 
       modifiers:(NSUInteger)flags 
          client:(id)sender;

但没有运气;应用修饰符时,不会调用简单的方法。更具体地说,commandandalt键不会被上述方法捕获。shift像和ctrl工作这样的简单修饰符(并且flags在第二种方法中设置了修饰符变量)。启动 Apple 的示例应用程序NumberInput来亲自查看。

有什么建议么?我完全走错了吗?

4

1 回答 1

1

简短的回答:

使用handleEvent:client:和收听NSFlagsChanged事件。


IMKInputController实现了IMKServerInput 协议,它提供了三种处理事件的方法。

  1. 键绑定 - 使用inputText:client:didCommandBySelector:client:
  2. 仅文本数据 - 使用inputText:key:modifiers:client:
  3. 处理所有事件 - 使用handleEvent:client:

好像你只尝试了前两个。您可以使用第三个选项实现目标。

尝试以下操作:

  1. 覆盖recognizedEvents:(来自IMKStateSetting 协议

    - (NSUInteger)recognizedEvents:(id)sender
    {
        return NSKeyDownMask | NSFlagsChangedMask;
    }
    
  2. 并使用handleEvent:client:

    -(BOOL)handleEvent:(NSEvent*)event client:(id)sender
    {
        NSLog(@"handling event: %@", event);
        return false;
    }
    

您可以在控制台中看到修饰符的每个 keydown 和 keyup 的打印输出,包括commandalt

于 2014-05-18T09:34:22.137 回答