2017-08-28 7 views
0

Dans mon application Mac, j'écoute les événements de touche et les transmet au client interne, en fonction des modificateurs et du code de touche.NSView ne peut pas saisir l'événement Ctrl + Tab Keydown

Actuellement, je suis confronté au problème, que je ne peux pas obtenir l'événement "Ctrl + Tab". Il semble que le "App" lui-même essaie de gérer cela, ce qui est logique pour les applications basées sur les onglets. J'ai donc désactivé le mode Tabbing, mais le raccourci Ctrl + Tab ne déclenche jamais l'événement KeyDown. Toute autre combinaison de code clé et modificateur semble passer très bien.

Des suggestions sur la façon de déclencher l'événement de touche enfoncée pour Ctrl + Tab?

+0

Utilisez NSEventModifierFlags. –

Répondre

1

Dans mes tests, NSView méthode -keyDown: ne semble pas être appelé sur NSView sous-classes pour les événements de clé onglet de contrôle. Cependant, vous pouvez les intercepter au niveau de l'application d'une sous-classe 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 
+0

Ce serait une très mauvaise idée, à moins que vous ne vouliez que l'événement clé se trouve au-dessus de l'objet de vue concerné. –

+0

Vous auriez besoin d'ajouter du code pour vérifier les conditions correctes lorsque l'événement devrait être géré, et appeler l'implémentation de super le reste du temps, oui. C'est brutal, mais c'est la seule façon que j'ai trouvée pour capturer la frappe que l'OP veut capturer. –

+0

Merci pour cette solution. Cela m'a orienté dans la bonne direction. La chose amusante est, j'ai dû surcharger NSWindow aussi pour obtenir l'événement keyDown dans mon NSView qui est en fait le NSWindowDelegate dans mon cas. On dirait que toutes les instances de la chaîne essaient d'éviter le Ctrl + Tab. – Steve