Je travaille sur une application d'apprentissage de la dactylographie pour Mac OSX qui a besoin que les frappes lui soient transmises, même lorsque l'application n'est pas en cours.
Existe-t-il un moyen de faire en sorte que le système transmette les frappes de touches à l'application, éventuellement par le biais du NSDistributedNotificationCenter ? J'ai cherché sur Google et je n'ai pas trouvé de réponse...
EDIT : Exemple de code ci-dessous .
Merci @NSGod de m'avoir orienté dans la bonne direction - j'ai fini par ajouter un moniteur d'événements mondiaux en utilisant la méthode addGlobalMonitorForEventsMatchingMask:handler :, qui fonctionne à merveille. Pour être complet, ma mise en œuvre ressemble à ceci :
// register for keys throughout the device...
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
handler:^(NSEvent *event){
NSString *chars = [[event characters] lowercaseString];
unichar character = [chars characterAtIndex:0];
NSLog(@"keydown globally! Which key? This key: %c", character);
}];
Pour moi, la partie la plus délicate était l'utilisation des blocs, je vais donc donner une petite description au cas où cela aiderait quelqu'un :
Ce qu'il faut remarquer dans le code ci-dessus, c'est qu'il s'agit uniquement de un seul appel de méthode sur NSEvent. Le bloc est fourni comme argument, directement à la fonction. On peut considérer cela comme une méthode de délégation en ligne. Comme il m'a fallu un certain temps pour comprendre, je vais le faire étape par étape :
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
La première partie ne pose aucun problème. Vous appelez une méthode de classe sur NSEvent, et vous lui indiquez quel événement vous voulez surveiller, dans ce cas NSKeyDownMask. A liste des masques pour les types d'événements pris en charge peuvent être trouvés ici .
Maintenant, nous arrivons à la partie délicate : le handler, qui attend un bloc :
handler:^(NSEvent *event){
Il m'a fallu quelques erreurs de compilation pour y parvenir, mais (merci Apple) il s'agissait de messages d'erreur très constructifs. La première chose à remarquer est le carat ^. Il signale le début du bloc. Après ça, dans les parenthèses,
NSEvent *event
qui déclare la variable que vous utiliserez dans le bloc pour capturer l'événement. Vous pouvez l'appeler
NSEvent *someCustomNameForAnEvent
n'a pas d'importance, vous utiliserez simplement ce nom dans le bloc. Ensuite, c'est à peu près tout ce qu'il y a à faire. Veillez à fermer votre accolade et votre crochet pour terminer l'appel de méthode :
}];
Et vous avez terminé ! Il s'agit vraiment d'une sorte de "one-liner". Peu importe où vous exécutez cet appel dans votre application - je le fais dans la méthode applicationDidFinishLaunching de l'AppDelegate. Ensuite, à l'intérieur du bloc, vous pouvez appeler d'autres méthodes depuis votre application.
J'espère que cela aidera quelqu'un ! C'est vraiment très simple une fois que vous avez compris la syntaxe des blocs.