NSView не может получить событие Ctrl+Tab Keydown

В моем приложении Mac я прослушиваю события нажатия клавиш и передаю их внутреннему клиенту, в зависимости от модификаторов и кода клавиши.

В настоящее время я сталкиваюсь с проблемой, что я не могу удержать событие "Ctrl+Tab". Кажется, что само "приложение" пытается справиться с этим, что имеет смысл для приложений на основе вкладок. Поэтому я отключил режим Tabbing, но, тем не менее, Ctrl + Tab никогда не запускает событие KeyDown. Любая другая комбинация кода ключа и модификатора, кажется, проходит просто отлично.

Любые предложения о том, как запустить событие нажатия клавиши Ctrl+Tab?

1 ответ

Решение

В моем тестировании NSView"s -keyDown: метод не вызывается NSView подклассы для ключевых событий табуляции. Тем не менее, вы можете перехватить их на уровне приложения с помощью NSApplication подкласс:

@interface MyApplication: NSApplication
@end

@implementation MyApplication

- (void)sendEvent:(NSEvent *)event {
    if (event.type == NSEventTypeKeyDown &&
        [event.charactersIgnoringModifiers isEqualToString:@"\t"] &&
        (event.modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagControl) {
        NSLog(@"ctrl-tab");
    }

    [super sendEvent:event];
}

@end

Использование

override func viewDidLoad() {
    super.viewDidLoad()

    NSEvent.addLocalMonitorForEvents(matching: .keyDown) {
        if self.myKeyDown(with: $0) {
            return nil
        } else {
            return $0
        }
    }
}

а также

func myKeyDown(with event: NSEvent) -> Bool {
    // handle keyDown only if current window has focus, i.e. is keyWindow
    guard let locWindow = self.view.window,
          NSApplication.shared.keyWindow === locWindow else {
        return false
    }

    switch event.specialKey {

    case NSEvent.SpecialKey.tab:
        // your event for tab action
        return true
    default:
        break
    }
    return false
}

если вам нужны сочетания клавиш

func myKeyDown(with event: NSEvent) -> Bool {
    // handle keyDown only if current window has focus, i.e. is keyWindow
    guard let locWindow = self.view.window,
          NSApplication.shared.keyWindow === locWindow else {
        return false
    }

    switch event.specialKey {
    case NSEvent.SpecialKey.tab:
        // your code for tab action
        return true
    default:
        break
    }

    switch event.modifierFlags.intersection(.deviceIndependentFlagsMask) {
    case [.command]:
        switch event.charactersIgnoringModifiers! {
        case "w":
            // your code for cmd+w action (example)
            break
        default:
            break
        }
    }
    return false
}
Другие вопросы по тегам