【问题标题】:Trap each SHIFT key independently on OS X在 OS X 上独立捕获每个 SHIFT 键
【发布时间】:2015-08-04 07:39:31
【问题描述】:

我有工作代码 (here) 可以捕获非修饰键按下事件和修饰键更改事件的键码。

但如果你这样做:

LSHIFT down -> RSHIFT down -> RSHIFT up -> LSHIFT up

...内部的 2 个动作不会触发这些钩子中的任何一个,因为修饰符状态没有改变!

(编辑:糟糕!我应该在写之前测试一下,因为实际上每次实际更改都会产生一个新的修饰符更改。)

我唯一的想法可能是在更低的水平上额外观看(here)——但无论我从哪个角度看,它都不好看。

【问题讨论】:

  • 不,它们有单独的键码——我通过执行第二个链接中的代码确认了这一点。
  • 假设您正在使用 Obj-C(给定 OSX 标签)制作一个 Cocoa 应用程序,您可以使用代码 here。实施-(void)flagsChanged:(NSEvent*) 并检查[theEvent modifiers]。 LShift 为 131330,RShift 为 131332
  • @Arc676,你这玩意儿!我刚刚测试过,它确实正确地隔离了 L&R Shift 事件。甚至像 +L+R-L-R 和 +L+R-R-L 这样的组合。如果您将其作为答案,我将很乐意接受。

标签: macos hook keyboard-events tap iokit


【解决方案1】:

取自 Justin Boo 的回答 here

我添加了更多修饰符,以防万一有人偶然发现它并想要其他键。

- (void) flagsChanged:(NSEvent*)theEvent{
    if ([theEvent modifier] == 131330){
        //do stuff regarding left shift
    }else if ([theEvent modifier] == 131332){
        //do stuff regarding right shift
    }else if ([theEvent modifier] == 65792){
        //caps lock is on
    }else if ([theEvent modifier] == 8388864){
        //FN key pressed
    }else if ([theEvent modifier] == 262401){
        //control key pressed
    }else if ([theEvent modifier] == 524576){
        //option key pressed
    }else if ([theEvent modifier] == 1048840){
        //command key pressed
    }else if ([theEvent modifier] == 256){
        //there are no modified pressed and caps lock is off
    }
}

我建议在您的类中存储一些BOOLs,例如LShiftDownRShiftDown,因为当按下修饰符时应该调用此方法。您可能还可以在 keyDown 实现中检测此属性,以检测诸如“a”和“A”之类的差异。

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 2013-10-28
    • 1970-01-01
    • 2010-12-30
    • 2013-11-13
    • 1970-01-01
    • 2012-08-10
    • 2014-01-23
    • 2015-04-11
    相关资源
    最近更新 更多