objective-c - 使用 IMKit(或类似的)拦截 Command+key

标签 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;

但运气不佳;应用修饰符时,不会调用这些方法。更具体地说,上面的方法不会捕获 commandalt 键。像 shiftctrl 这样的简单修饰符可以工作(并且修饰符 flags 变量在第二种方法中设置)。启动 Apple 的示例应用程序 NumberInput亲自看看。

有什么建议吗?我是不是走错了路?

最佳答案

简短回答:

Use handleEvent:client: and listen to the NSFlagsChanged event.

<小时/>

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

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

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

尝试以下操作:

  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;
    }
    

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

关于objective-c - 使用 IMKit(或类似的)拦截 Command+key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21412985/

相关文章:

ios - 当用户在 ScrollView 内滑动时关闭键盘

MongoDB-Community 未在 Mac 上启动并出现错误

objective-c - Objective-C 的 "stringWithFormat:"方法发生了什么?

java - 在 OS X Java 应用程序中处理自定义 URL 方案

objective-c - 从窗口坐标转换 NSPoint

cocoa - 界面生成器 - 使用布局 View 框

objective-c - 检查 NSString 是否包含来自不同 NSString 的字符

ios - 禁用 Nagle 的 NSOutputStream 算法

IOS 将图像保存为相机胶卷中的圆形

macos - 如何编译导出符号的 Haskell Mach-O 可执行文件?