我尝试使用Carbon的函数RegisterEventHotKey
来创建按下命令键时的热键。我这样使用它:
InstallEventHandler(GetApplicationEventTarget(), handler, 1, &eventType, nil, nil)
RegisterEventHotKey(UInt32(cmdKey), 0, hotKeyID, GetApplicationEventTarget(), 0, &hotKeyRef)
但是,当我只使用命令键时,它不会调用handler
。如果我用任何其他非修饰键代码替换cmdKey
,则会调用该处理程序。
是否有人有任何建议允许应用程序在按下命令键时全局识别?感谢。
答案 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")
}
}
}
}