我正在使用事件监视器来检测swift中的按键事件。然而,事件监视器似乎没有检测命令键或任何其他修改键(shift, tab, opt…)按下。是否有不同的方法来检测修改键按下?请注意,我不是在寻找一种方法来检测键组合(例如:cmd+r),这可以通过使用event.modifierFlags
来完成,而是一种方法来知道何时单独按下命令键。
override func viewDidLoad() {
super.viewDidLoad()
NSEvent.addLocalMonitorForEvents(matching: .keyDown, handler: commandKey(evt:))
}
func commandKey(evt: NSEvent) -> NSEvent{
if evt.keyCode == 55 { //key code for command is 55
print("commanded")
}
return evt
}
找到解决方案了。似乎.flagsChanged
事件是用来检测修改键按下的。
override func viewDidLoad() {
super.viewDidLoad()
NSEvent.addLocalMonitorForEvents(matching: .flagsChanged, handler: commandKey(evt:))
}
func commandKey(evt: NSEvent) -> NSEvent{
if evt.modifierFlags.contains(.command){
print("commanded")
}
return evt
}
// monitor will work iside your app and outside as global monitor
let monitor = NSEvent.localAndGlobalMonitor(matching: .flagsChanged)
monitor
.filter { $0.modifierFlags.check(equals: [.command]) }
.onUpdate { _ in print("CMD key pressed. And only CMD.") }
检查的函数:
- 这组修饰符被按下
- 所有其他修饰符-不
import SwiftUI
extension NSEvent.ModifierFlags {
func check(equals: [NSEvent.ModifierFlags] ) -> Bool {
var notEquals: [NSEvent.ModifierFlags] = [.shift, .command, .control, .option]
equals.forEach{ val in notEquals.removeFirst(where: { $0 == val }) }
var result = true
equals.forEach{ val in
if result {
result = self.contains(val)
}
}
notEquals.forEach{ val in
if result {
result = !self.contains(val)
}
}
return result
}
func check(oneOf flags: [NSEvent.ModifierFlags] ) -> Bool {
for flag in flags {
if check(equals: [flag]) {
return true
}
}
return false
}
}
public extension Array {
mutating func removeFirst(where predicate: (Element)->(Bool)) {
if let idx = self.firstIndex(where: predicate) {
remove(at: idx)
}
}
}
警告:此代码未使用CapsLock进行测试