使用IMKit拦截命令+键(或类似)

时间:2014-01-28 17:48:25

标签: objective-c macos cocoa appkit input-method-kit

我希望拦截Command键组合,并认为IMKit将是一个不错的选择。通过扩展IMKInputController,我可以拦截大多数密钥,但它似乎忽略了修改后的密钥。

我试过覆盖

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

和(或者)

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

但没有运气;应用修改器时,不会调用pl​​ain方法。更具体地说,commandalt键不会被上述方法捕获。像shiftctrl这样的简单修饰符(以及修饰符flags变量在第二种方法中设置)。启动Apple的示例应用程序NumberInput以便自己查看。

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

1 个答案:

答案 0 :(得分:1)

简短回答:

  

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


IMKInputController实现了IMKServerInput Protocol,它为处理事件提供了三种选择。

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

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

    尝试以下方法:

    1. 覆盖recognizedEvents:(来自IMKStateSetting Protocol

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

      -(BOOL)handleEvent:(NSEvent*)event client:(id)sender
      {
          NSLog(@"handling event: %@", event);
          return false;
      }
      
    3. 您可以在控制台中查看修改器的每个keydown和keyup上的打印输出,包括commandalt