Reputation: 1634
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?
Upvotes: 7
Views: 1338
Reputation: 1634
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
Upvotes: 5