使 keydown NSEvent 在 Swift 中运行一次

问题描述

NSEvent keydown 代码在按下键时重复运行。如何确保事件只运行一次然后停止侦听直到发生 key up 事件?

    override func viewDidLoad() {
        super.viewDidLoad()
        NSEvent.addLocalMonitorForEvents(matching: .keyDown,handler: doSomething(event:))
    }
    
    func doSomething(event: NSEvent) -> NSEvent{
        // 36 is key code for ENTER key 
        if event.keyCode == 36{
            print("Hello World!")
        }
        return event
    }

解决方法

您可以使用 isARepeat 属性简单地检查 NSEvent 是否重复:

func doSomething(event: NSEvent) -> NSEvent {
    if event.keyCode == 36,!event.isARepeat {
        print("Hello World!")
    }
    return event
}

如果您只是想摆脱按键声音,您需要将返回类型更改为可选并返回 nil:

func doSomething(event: NSEvent) -> NSEvent? {
    guard !event.isARepeat else {
        // this will suppress the key sound if you return nil and not propagate the key down event
        return nil
    }
    if event.keyCode == 36 {
        print("Hello World!")
        // if you want to suppress the key sound when is not a repeat just return nil here as well
        return nil
    }
    
    return event
}