Objective c 拦截命令+;带IMKit(或类似工具)的钥匙

Objective c 拦截命令+;带IMKit(或类似工具)的钥匙,objective-c,macos,cocoa,appkit,input-method-kit,Objective C,Macos,Cocoa,Appkit,Input Method Kit,我想截取命令键组合,并认为IMKit将是一个不错的选择。通过扩展IMKInputController我可以截获大多数键,但它似乎忽略了修改过的键 我已经试过了 -(BOOL)inputText:(NSString*)string client:(id)sender; 及(或) 但是没有运气;当应用修饰符时,不会调用简单的方法。更具体地说,命令和alt键不会被上述方法捕获。像shift和ctrl这样的简单修饰符起作用(修饰符flags变量在第二种方法中设置)。启动Apple的示例应用程序,亲自查

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

我已经试过了

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

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

有什么建议吗?我是不是完全走错了方向?

简短回答:

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


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

  • 键绑定-使用
    inputText:client:
    didCommandBySelector:client:
  • 仅文本数据-使用
    inputText:key:modifiers:client:
  • 处理所有事件-使用
    handleEvent:client:
  • 看来你只试过前两个。您可以使用第三个选项实现目标

    请尝试以下操作:

  • 覆盖识别设备:(从)

  • 并使用
    handleEvent:client:

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

  • 您可以在Console中看到修改器的每个向下键和向上键的打印输出,包括
    命令
    alt

    发生了什么,它们没有被调用?“不走运”有点含糊不清……更新了…………测试这一点,在
    recognizedEvents:
    中设置
    NSKeyUpMask
    ,仍然无法捕获
    NSKeyUp
    类型事件。认为这是解决这个问题的办法,但显然不是:
    - (NSUInteger)recognizedEvents:(id)sender
    {
        return NSKeyDownMask | NSFlagsChangedMask;
    }
    
    -(BOOL)handleEvent:(NSEvent*)event client:(id)sender
    {
        NSLog(@"handling event: %@", event);
        return false;
    }