【问题标题】:Intercept Command+key with IMKit (or similar)使用 IMKit(或类似工具)拦截 Command+key
【发布时间】:2014-02-20 04:30:31
【问题描述】:

我正在寻找拦截命令组合键,并认为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 亲自查看。

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

【问题讨论】:

  • 发生了什么,他们没有被调用? “没有运气”有点模糊......
  • 更新......

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


【解决方案1】:

简答:

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


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

  1. 键绑定 - 使用 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

【讨论】:

  • 对此进行测试,在recognizedEvents: 中设置NSKeyUpMask 仍然无法捕获NSKeyUp 类型的事件。认为这将是这个问题的解决方案,但显然不是:stackoverflow.com/questions/23620864/…
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2018-01-16
  • 2022-08-05
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多