accès asynchrone au clavier

Dans mon appli, j'ai besoin de connaitre l'état des touches modifieurs ( Control , Option, Command) du clavier à l'instant T, en dehors de tout NSEvent, c'est à dire de manière asynchrone. ( ex Carbon GetAsyncKeyState() )
Y a t'il une façon de faire çà en Cocoa ?
THX
Paul

Réponses

  • Salut, j'ai trouvé ça sur StackOverflow : https://stackoverflow.com/questions/16150267/mac-os-x-get-state-of-spacebar
    hope this helps (comme on dit;^).

  • Merci... mais c'est du vieux Carbon. Je cherche une solution Cocoa.
    et je pense que j'ai trouvé :

    #import "CoreGraphics/CGEventTypes.h"
    #import "CoreGraphics/CGEventSource.h"
    
    CGEventFlags theFlags;
        theFlags = CGEventSourceFlagsState(kCGEventSourceStateHIDSystemState); 
    

    à tester contre les constantes:

    kCGEventFlagMaskAlphaShift,kCGEventFlagMaskControl,kCGEventFlagMaskAlternate,kCGEventFlagMaskCommand
    

    ou bien:

    NSEventModifierFlags flags= [NSEvent modifierFlags] 
    

    à tester contre les constantes:

    NSControlKeyMask,NSShiftKeyMask, NSAlphaShiftKeyMask,NSAlternateKeyMask,NSCommandKeyMask
    

    Les 2 fonctionnent.

    HTH...

  • C'est plutôt bon à savoir tout ça !
    Par contre j'ai du mal à voir pour quel use-case ceci est utile.

  • y'en a plein... par exemple dans une appli 3D, pour changer le curseur avant qu'il ne se passe quelque chose !
    ( le curseur va alors indiquer ce qui va se passer au prochain clic selon la combinaison des touches modifiers , ex: type de mouvement de camera, démarrage d'un d'un zoom fenêtre, variante de fonction selon la position du curseur...) Jette un oeil ici si ça t'intéresse...

  • klogklog Membre

    Il y a les local et global monitors (addLocalMonitorForEventsMatchingMask et addGlobalMonitorForEventsMatchingMask) qui permettent de monitorer les keyDown par exemple, à l'aide d'un bloc :

    _keyDownEventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^NSEvent *(NSEvent *event) {
    
        if (...)
        {
        }    
    
        return event;
      }];
    
  • ah oui ! très intéressant pour monitorer des events au plus bas niveau...

Connectez-vous ou Inscrivez-vous pour répondre.