NSView无法抓取Ctrl + Tab Keydown事件

时间:2017-08-28 20:56:07

标签: objective-c nsview nswindow nsapplication

在我的Mac应用程序中,我会听取按键事件并将其传递给内部客户端,具体取决于修饰符和键码。

目前,我正面临这个问题,我无法控制" Ctrl + Tab"事件。似乎" App"本身试图处理这个问题,这对基于选项卡的应用程序很有意义。所以我禁用了Tabbingmode,但仍然,Ctrl + Tab永远不会触发KeyDown事件。关键代码和修饰符的任何其他组合似乎都可以通过。

有关如何为Ctrl + Tab触发按键事件的任何建议吗?

2 个答案:

答案 0 :(得分:1)

在我的测试中,NSView的{​​{1}}方法似乎没有在-keyDown:子类上调用控制选项卡键事件。但是,您可以在应用程序级别使用NSView子类拦截它们:

NSApplication

答案 1 :(得分:0)

使用

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
}