Swift中的全局修改键按键检测

时间:2017-01-30 01:22:14

标签: swift macos macos-carbon

我尝试使用Carbon的函数RegisterEventHotKey来创建按下命令键时的热键。我这样使用它:

InstallEventHandler(GetApplicationEventTarget(), handler, 1, &eventType, nil, nil)
RegisterEventHotKey(UInt32(cmdKey), 0, hotKeyID, GetApplicationEventTarget(), 0, &hotKeyRef)

但是,当我只使用命令键时,它不会调用handler。如果我用任何其他非修饰键代码替换cmdKey,则会调用该处理程序。

是否有人有任何建议允许应用程序在按下命令键时全局识别?感谢。

1 个答案:

答案 0 :(得分:7)

您可以将符合.flagsChanged的事件的全局监视器添加到视图控制器,以便您可以检查其modifierFlags与deviceIndependentFlagsMask的交集,并检查生成的键。

  

声明

class func addGlobalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> Void) -> Any?
  

安装一个事件监视器,用于接收发布到的事件的副本   其他应用。事件以异步方式发送到您的应用   你只能观察事件;你无法修改或以其他方式   防止事件传递到其原始目标   应用。只有可访问性才可以监控与密钥相关的事件   已启用或您的应用程序受信任以进行辅助功能访问   (参见AXIsProcessTrusted())。请注意,不会调用您的处理程序   对于发送到您自己的应用程序的事件。

import Cocoa
class ViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged) {
            switch $0.modifierFlags.intersection(.deviceIndependentFlagsMask) {
            case [.shift]:
                print("shift key is pressed")
            case [.control]:
                print("control key is pressed")
            case [.option] :
                print("option key is pressed")
            case [.command]:
                print("Command key is pressed")
            case [.control, .shift]:
                print("control-shift keys are pressed")
            case [.option, .shift]:
                print("option-shift keys are pressed")
            case [.command, .shift]:
                print("command-shift keys are pressed")
            case [.control, .option]:
                print("control-option keys are pressed")
            case [.control, .command]:
                print("control-command keys are pressed")
            case [.option, .command]:
                print("option-command keys are pressed")
            case [.shift, .control, .option]:
                print("shift-control-option keys are pressed")
            case [.shift, .control, .command]:
                print("shift-control-command keys are pressed")
            case [.control, .option, .command]:
                print("control-option-command keys are pressed")
            case [.shift, .command, .option]:
                print("shift-command-option keys are pressed")
            case [.shift, .control, .option, .command]:
                print("shift-control-option-command keys are pressed")
            default:
                print("no modifier keys are pressed")
            }
        }
    }
}