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
}