我正在尝试使用Carbon的功能RegisterEventHotKey为按下命令键时创建一个热键。我这样使用它:
RegisterEventHotKey
InstallEventHandler(GetApplicationEventTarget(), handler, 1, &eventType, nil, nil) RegisterEventHotKey(UInt32(cmdKey), 0, hotKeyID, GetApplicationEventTarget(), 0, &hotKeyRef)
但是,handler仅使用命令键时不会调用。如果我替换cmdKey为其他任何非修饰键代码,则将调用处理程序。
handler
cmdKey
有没有人有任何建议可以让应用程序在按下命令键时全局识别?谢谢。
您可以将与事件匹配的“全局事件监控器”添加.flagsChanged到视图控制器,以便您可以检查它的modifierFlags与deviceIndependentFlagsMask的交集并检查生成的键。
.flagsChanged
宣言
class func addGlobalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> Void) -> Any?
安装事件监视器,该监视器接收发布到其他应用程序的事件的副本。事件是异步传递到您的应用程序的,您只能观察事件;您不能修改或以其他方式阻止事件传递到其原始目标应用程序。与密钥相关的事件仅在启用了可访问性或信任您的应用程序可访问性的情况下才可以监视。请注意,对于发送到您自己的应用程序的事件,不会调用您的处理程序。
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") } } } }