Swift OSX:同时命令+非修饰键事件

时间:2017-09-19 00:39:40

标签: swift macos

我一直试图在堆栈溢出时找到这个,但只有一个关于同时按下非修改键的链接,这需要一些状态检查才能得到所需的结果。

我正在尝试创建命令,例如命令+ 1,命令+ 2,...,命令+ n或选项+ I或ctrl + q,每个命令都是修饰键和非修饰键的组合。

我使用了所有覆盖,例如keyDown和keyUp,并使用InterpretKeyEvents覆盖其他键,例如cancelOperation或newLine。

我找到了一个覆盖,它接受修饰键的状态(flagsChanged)

但上面似乎只注册了我可以用NSEvent的修饰符标志检查器提取的修饰键的状态,但我似乎无法通过同步按键来调用所需的函数。

我正在尝试使用不同的组合来访问数字键,因此每个修饰符+数字将为我提供该数字的不同配置。

1 个答案:

答案 0 :(得分:0)

所以为了完整起见,感谢你们的建议,我采取了一种方法:

指向整数的字母数字键字典 2字典指向与alfanumericals的整数返回相关联的函数 3 - 下面的密钥捕获代码。可以通过将2个函数指针与修饰符rawIndex值相关联来改进它,但这对于任何可能遇到问题或可能会提出相同问题的人来说都应该足够了。在分析中,我在按键和被叫函数跟踪结束之间的平均响应时间为0.2 - 0.8 ms。

    override func keyDown(with event: NSEvent) {
        let modifierFlags = event.modifierFlags
        let key = event.characters!
        if !event.isARepeat{
            if modifierFlags.rawValue == 256{
//No modifiers pressed
                guard let track = Int(key) else{
//not a number key so proceed with the function library containing relevant pointers
                    functionLib[keys[key]!]!(0)
//keys is [String: Int]
                    return
                }
//Proceed with another function as we are using number keys
                command(keys[key]!)
            }else if modifierFlags.contains(NSEventModifierFlags.command){
//Command key is being pressed simultaneously
                guard let track = Int(key) else{
//Go into command and non number key combinations
                    functionLib[commandKeys[key]!]!(0)
                    return
                }
//Command and number key combo function call
                openTrack(track)
            }
    }
    }

注意:函数库中有void函数允许非映射键导致返回函数,因此有几个,字典:仅键,命令+键,选项+键等等。要使用的完整命令集。 此外,避免if else语句并获得1-3渐近点的一个额外步骤是将修饰符键rawValue与其自己的dict相关联。可能是一种monadish结构,但似乎足够快。