I am working on a macOS app and I would like to handle a local hotkey event (command + up arrow key) in a NSViewController
.
Here's how I do it with Swift:
override func keyDown(with event: NSEvent) {
let modifierkeys = event.modifierFlags.intersection(.deviceIndependentFlagsMask);
let hasCommand = modifierkeys == .command;
switch Int(event.keyCode) {
case kVK_UpArrow where hasCommand:
print("command up");
break;
case kVK_ANSI_B where hasCommand:
print("command B");
break;
default:
break;
}
}
When I build and press command+up in the view, the console shows nothing. But when I press command+B, "command B" is logged out.
So why isn't this working for Command+up? How should I achieve this?
I've found the solution:
self.keyMonitor = NSEvent.addLocalMonitorForEvents(matching: NSEventMask.keyDown, handler: { (event) -> NSEvent? in
if (event.modifierFlags.contains(.command)){
if (Int(event.keyCode) == kVK_UpArrow){
print("command up");
return nil;
}
}
return event;
});
The key point is to interrupt the keydown event and prevent it from being dispatched by returning nil
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With