Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cocoa Listen to Keyboard command+up Event

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?

like image 288
hklel Avatar asked Apr 06 '17 12:04

hklel


1 Answers

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

like image 163
hklel Avatar answered Sep 30 '22 07:09

hklel