2009-10-06 5 views
1

J'ai essayé de lire sur la documentation d'Apple mais je ne trouve nulle part comment capturer un événement clé (espace ou autre) dans une application NSDocument.NSDocument et clavier (comme keyDown)

Avec initialFirstRepsodner si j'ai bien compris ce n'est pas possible.

Une idée?

grâce à tous! Andrea

+0

Je ne peux pas définir InitialFirstResponder chez le propriétaire du fichier .... –

+0

Je crois que les informations à http://developer.apple.com/mac/library/DOCUMENTATION/ Cocoa/Conceptuel/EventOverview/HandlingKeyEvents/HandlingKeyEvents.html #/apple_ref/doc/uid/10000060i-CH7 doit s'appliquer aux applications basées sur NSDocument. – geoffspear

+0

Si j'ai bien compris ce n'est pas possible ... –

Répondre

0

Si vous souhaitez capturer tous les événements qui vont dans une fenêtre, vous pouvez la sous-classer et redéfinir -sendEvent :. Si vous souhaitez capturer tous les événements de l'application entière, vous pouvez remplacer la même méthode dans une sous-classe NSApplication.

+0

Ce n'est pas clair pour moi. Je suis novice dans Cocoa dev. Je travaille avec QTRecorder exemple d'Apple, donc, si je veux gérer tous les événements, dois-je ajouter une autre classe qui est une sous-classe de NSDocument? –

1

J'ai essayé de lire sur la documentation d'Apple, mais je ne trouve nulle part comment capturer un événement clé (espace ou autre) dans une application NSDocument.

Que voulez-vous gérer pour les événements clés? Vous devez implémenter keyDown: quelque part, mais exactement où cela dépend de ce que vous avez l'intention de faire.

+0

Je dois démarrer et arrêter la capture vidéo avec la touche espace et capturer une image avec la touche Entrée. J'ai implémenté keyDown sur ma classe NSDocument, mais je ne sais pas où définir le premier répondeur dans le fichier nib. –

+0

Ce n'est pas le cas. Voir ce commentaire à moi où j'explique l'icône First Responder dans IB: http://stackoverflow.com/questions/598455/objective-c-cocoa-first-responder-did-i-get-that-right/598663#598663 –

+0

En ce qui concerne votre tâche: Il semble que vous vouliez un raccourci clavier global. Vous ne l'appliquez pas du tout via la chaîne de répondeurs Cocoa, mais avec une touche d'accès rapide Carbon Events. (Malgré le nom, ils sont toujours pris en charge en 64 bits.) Il existe également une classe tierce nommée PTHotKey qui place une API basée sur Cocoa au-dessus de cette API basée sur Carbon. –

-1

Je recommanderais d'utiliser NSUserDefaults et de stocker vos combinaisons de clés globales partagées, puis de vérifier keyDown: par rapport à ces préférences stockées, puis en basant vos actions sur la touche enfoncée.

-à-dire: #define kMyKeyCommand @ "i"

0

tout d'abord, vous devez créer une sous-classe de NSWindow. Dans xcode do: Fichier -> Nouveau fichier -> Objective C Class. donne un nom comme "NSWindowMyEvents". Cela va créer 2 fichiers: .h .m &, allez à la NSWindowMyEvents.h et faire la déclaration comme suit:

@interface NSWindowMyEvents : NSWindow { 

} 

Enregistrer les modifications et compiler (pour être sûr que IB lit le nouvel en-tête 0 si elle est déjà ouvert).

Ouvrez le générateur d'interface et chargez votre fichier nib/xib qui contient votre document/fenêtre principale. Assurez-vous que la sortie "fenêtre" du propriétaire du fichier est définie sur votre fenêtre principale. Cliquez sur votre fenêtre principale (celle que vous voulez obtenir des événements) et définissez sa classe (via l'inspecteur d'identité cmd + 6) pour être: NSWindowMyEvents au lieu de NSWindow que c'est maintenant.

Enregistrer les modifications!

Retour à Xcode et NSWindowMyEvents.m et collez le code suivant:

- (void)keyDown:(NSEvent *)theEvent 
{ 
    NSLog(@"keyDown!"); 
    if ([[NSApp currentEvent] modifierFlags] & NSCommandKeyMask) 
    { 
     NSLog(@"CommandKey Down!"); 
    } 

    [super keyDown:theEvent]; 
} 

Envoyer l'événement Super si vous voulez, passer l'événement au reste répondeur chaîne. Vous manipulez maintenant les événements clavier. De même, vous pouvez gérer n'importe quel événement dans NSWindowMyEvent.m

espoir qui aide ....

+0

oh, vous pouvez utiliser le code suivant pour gérer l'espace ctr ... if ([theEvent keyCode] == 36) ... (Ceci est la touche de retour) – Vassilis