keyDown

iLandesiLandes Membre
mars 2013 modifié dans API AppKit #1
Bonjour,



Je bug sur un problème dans la comparaison de valeurs.



Voila le topo, j'ai fais une petite application et je voudrais détecter quand l'utilisateur de la vue frappe la touche flèche bas ou flèche haut sur son clavier.



J'ai crées un fichier d'entête


<br />
@interface EDTVMidiNoteView : NSView<br />




J'ai placé le code ci-dessous dans le fichier .m Je mets ici des extraits de code


<br />
-(void)keyDown:(NSEvent *)theEvent<br />
{<br />
	[self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];<br />
}<br />
- (void)interpretKeyEvents:(NSArray *)eventArray<br />
{<br />
	// NSNumber *keyCode = [eventArray valueForKey:@&quot;keyCode&quot;];<br />
	if ([[eventArray valueForKey:@&quot;keyCode&quot;] isEqualTo:@&quot;125&quot;] ) {<br />
		NSLog(@&quot;+1&quot;);<br />
	} else if ([[eventArray valueForKey:@&quot;keyCode&quot;] isEqualTo:@&quot;126&quot;]) {<br />
		NSLog(@&quot;-1&quot;);<br />
	}<br />
	NSLog(@&quot;%@&quot;,[eventArray valueForKey:@&quot;keyCode&quot;]);<br />
}<br />




Je sais que les codes des touches que je recherche sont 125 et 126, j'ai pu le vérifier grâce au dernier NSLog. Mais comment faire dans mon instruction if pour les détecter ? Je bug entre utiliser isEqual, isEqualTo et ==



De plus je suis certain qu'il existe des constantes pour remplacer 125 et 125 par NSarrowDown NSarroyUP, impossible de trouver dans la doc.



D'avance merci pour votre aide.





s

e

b

Réponses

  • jpimbertjpimbert Membre
    mars 2013 modifié #2
    <br />
    -(void)keyDown:(NSEvent *)theEvent<br />
    {<br />
    	    if (theEvent.keyCode == 125 ) {<br />
    		    NSLog(@&quot;+1&quot;);<br />
    	    } else if (theEvent.keyCode == 126) {<br />
    		    NSLog(@&quot;-1&quot;);<br />
    	    }<br />
    	    NSLog(@&quot;%d&quot;,theEvent.keyCode);<br />
    }<br />
    
  • LarmeLarme Membre
    D'après la doc, keyCode est un unsigned short...



    Par contre c'est un NSArray, t'as un valueForKey dedans ?



    http://stackoverflow.com/questions/275088/how-do-i-collect-key-input-in-a-video-game-style-cocoa-app
  • Bonsoir et merci pour l'aide rapide



    Voici le code que j'ai finalement adopté en attendant de trouver les constantes qui doivent forcément exister quelque part. Désolé je n'utilise pas la notation par "." car Aaron le déconseille (cf les livres d'Aaron Hillegass image/smile.png' class='bbc_emoticon' alt=':)' /> )


    <br />
    #pragma mark - Key down<br />
    -(BOOL)acceptsFirstResponder<br />
    {<br />
        return YES;<br />
    }<br />
    -(void)keyDown:(NSEvent *)theEvent<br />
    {<br />
        if ([theEvent keyCode] == 125 ) {<br />
    	    NSLog(@&quot;+1&quot;);<br />
        } else if ([theEvent keyCode] == 126) {<br />
    	    NSLog(@&quot;-1&quot;);<br />
        }<br />
    }<br />
    
  • 'seb@stien' a écrit:


    Désolé je n'utilise pas la notation par "." car Aaron le déconseille (cf les livres d'Aaron Hillegass image/smile.png' class='bbc_emoticon' alt=':)' /> )






    Ce brave Aaron utilise la notation entre crochets pour accéder à  une propriété afin que les lecteurs débutants ne confondent pas la notation pointée du C et celle de l'Objective-C :
    • utilisée sur une structure C, la notation pointée permet d'accéder à  un composant de la structure (une zone mémoire)
    • en Objective-C, la notation pointée est converti en appel de méthode (accesseur et mutateur de la propriété)


    L'argument d'Aaron est donc purement didactique. Je te conseille de suivre cette recommandation si :
    • ton code est à  but didactique pour des débutants
    • ou si tu es toi-même débutant et tu confond encore C et Objective-C
  • 'seb@stien' a écrit:


    De plus je suis certain qu'il existe des constantes pour remplacer 125 et 125 par NSarrowDown NSarroyUP, impossible de trouver dans la doc.




    Il semblerait que les Enum qui existaient en Carbon n'aient pas été intégrés dans Cocoa. Le plus simple est de les refaire soi même.
  • merci du conseil j'enlèverais les crochets quand j'aurais grandis image/wink.png' class='bbc_emoticon' alt=';)' />



    je vais voir les Enum comment ça marche
  • mpergandmpergand Membre
    mars 2013 modifié #8
    'seb@stien' a écrit:


    merci du conseil j'enlèverais les crochets quand j'aurais grandis image/wink.png' class='bbc_emoticon' alt=';)' />



    je vais voir les Enum comment ça marche



    <br />
    enum<br />
    {<br />
    KeyCode_0 =82,<br />
    KeyCode_1 =83,<br />
    KeyCode_2 =84,<br />
    KeyCode_3 =85,<br />
    KeyCode_4 =86,<br />
    KeyCode_5 =87,<br />
    KeyCode_6 =88,<br />
    KeyCode_7 =89,<br />
    KeyCode_8 =91,<br />
    KeyCode_9 =92,<br />
    <br />
    KeyCode_Point=65,	// point sur le pavé numérique<br />
    KeyCode_Plus=69,<br />
    KeyCode_Minus=78,<br />
    KeyCode_Mul =67,<br />
    KeyCode_Div =75,<br />
    <br />
    KeyCode_PO =23,	// parenthèse ouvrante<br />
    KeyCode_PF =27,	// parenthèse fermante<br />
    <br />
    KeyCode_Exp =33,	// accent circonflexe<br />
    KeyCode_Compl=45,	// tilde ~<br />
    <br />
    KeyCode_BS =51,	// backspace<br />
    KeyCode_Del =117,	// delete<br />
    <br />
    KeyCode_FG =123,	// flèche gauche<br />
    KeyCode_FD =124,<br />
    KeyCode_FB =125,<br />
    KeyCode_FH =126,<br />
    <br />
    KeyCode_CLS =71,	// touche à  gauche de la touche = du pavé numérique<br />
    <br />
    KeyCode_Return=36,<br />
    KeyCode_Enter=76,<br />
    <br />
    };<br />
    enum<br />
    {<br />
    KeyValue_Euro=0x20ac,<br />
    KeyValue_PI=0x220f,<br />
    KeyValue_SQR=0x221a,<br />
    };<br />
    
  • LarmeLarme Membre
    Pour ceux qui se suivent, y'a pas besoin de mettre un "=" (sauf au premier), non ?

    Tu considères pas ça " safe " ?
  • je ne suis plus là  Larme
  • Bon, pour ce soir j'en suis arrivé là , cela fonctionne mais ce n'est pas très élégant, j'suis un peu déçu.


    <br />
    //<br />
    //  EDTVMidiNoteView.m<br />
    //  Midi Note Converter<br />
    //<br />
    //  Created by C3PO on 24/03/13.<br />
    //  Copyright (c) 2013 EdisonTV. All rights reserved.<br />
    //<br />
    #import &quot;EDTVMidiNoteView.h&quot;<br />
    @implementation EDTVMidiNoteView<br />
    <br />
    enum<br />
    {<br />
        KeyCode_W	   = 6,<br />
        KeyCode_FB	  = 125,<br />
        KeyCode_FH	  = 126,<br />
        Flag_CMD	    = 11534600,<br />
        Flag_CMDCOMBI   = 1048840 // cmd + another key<br />
    };<br />
    <br />
    #pragma mark - Key down<br />
    -(BOOL)acceptsFirstResponder<br />
    {<br />
        return YES;<br />
    }<br />
    -(void)keyDown:(NSEvent *)theEvent<br />
    {<br />
        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];<br />
    	<br />
        if ([theEvent keyCode] == KeyCode_FB) {<br />
    	    if ([theEvent modifierFlags] == Flag_CMD) {<br />
    			 [nc postNotificationName:@&quot;EDTVCHANGEVALUE&quot; object:@&quot;+12&quot;];<br />
    	    } else {<br />
    		    [nc postNotificationName:@&quot;EDTVCHANGEVALUE&quot; object:@&quot;+1&quot;];<br />
    		    }<br />
    	    } else if  ([theEvent keyCode] == KeyCode_FH)<br />
    	    {<br />
    		    if ([theEvent modifierFlags] == Flag_CMD) {<br />
    			    [nc postNotificationName:@&quot;EDTVCHANGEVALUE&quot; object:@&quot;-12&quot;];<br />
    		    } else {<br />
    			    [nc postNotificationName:@&quot;EDTVCHANGEVALUE&quot; object:@&quot;-1&quot;];<br />
    		    }<br />
    	    } else if ([theEvent keyCode] == KeyCode_W) {<br />
    		    if ([theEvent modifierFlags] == Flag_CMDCOMBI) {<br />
    			    [nc postNotificationName:@&quot;EDTVCMDWPRESSED&quot; object:self];<br />
    		    }<br />
    	    }<br />
    }<br />
    - (id)initWithFrame:(NSRect)frame<br />
    {<br />
        self = [super initWithFrame:frame];<br />
        if (self) {<br />
    	    //<br />
        }<br />
       <br />
        return self;<br />
    }<br />
    - (void)drawRect:(NSRect)dirtyRect<br />
    {<br />
        // Drawing code here.<br />
    }<br />
    <br />
    @end<br />
    
  • mpergandmpergand Membre
    mars 2013 modifié #12
    Tu dois pouvoir structurer un peu mieux, notamment avec des switch/case:
    <br />
    switch(key)<br />
       {<br />
       case KeyCode_Enter:<br />
       case KeyCode_Return:<br />
        if(sBasicParser.isRunning())<br />
    	 {<br />
    	 proceed=NO;<br />
    	 }<br />
        break;<br />
    <br />
       case KeyCode_FH:<br />
       case KeyCode_FB:<br />
        proceed=NO;<br />
        break;<br />
    <br />
       case KeyCode_FD:<br />
        proceed=YES;<br />
        break;<br />
    <br />
       default:<br />
        proceed=YES;<br />
    





    Pour ceux qui se suivent, y'a pas besoin de mettre un "=" (sauf au premier), non ?

    Tu considères pas ça " safe " ?




    Non y a pas de problème, mais comme ce ne sont pas des valeurs abitraires, les erreurs eventutelles d'affectation sont plus facile à  détecter
  • LarmeLarme Membre
    mars 2013 modifié #13
    'mpergand' a écrit:
    Non y a pas de problème, mais comme ce ne sont pas des valeurs abitraires, les erreurs eventutelles d'affectation sont plus facile à  détecter




    Ok, mais à  ce moment-là , si je ne profite pas de ça, je préfère mettre un #define (un peu moins safe par contre). C'est pas tout à  fait pareil, mais pour mon utilisation...





    seb@stien:

    Disons que si tu mets
    <br />
    enum {<br />
    A = 3,<br />
    B}<br />
    


    B, va prendre la valeur +1 de la précédente s'il n'a pas de valeur associée.

    Du coup, dans le cas précédent des valeurs des KeyCode_0 à  9, il suffisait juste d'intialiser la valeur du KeyCode_0...
  • C'est comment ta version avec #define Larme ?
  • #define nomValeur valeur
    


    Sans " ; ". Mais c'est moins safe. ça peut entraà®ner des erreurs à  des niveaux plus complexes. Et c'est pré-processoré...

    Un peu de recherche de ton côté sur les #define te permettra de voir les bons et mauvais côtés de ceux-ci.
  • Attention, les keycode peuvent ne pas être les même en fonction de si c'est un clavier FR ou EN. Pour les flèches, normalement, c'est bon, mais pour les ponctuations, il vaut mieux passer par les caractères unicode.
  • bonsoir,



    justement j'aimerai être sur que j'analyse les flèches quelque soit le clavier
  • Pour les flèche, ça devrait normalement être bon avec le keycode. Je dois implémenter cela dans une application demain, je pourrais confirmer à  ce moment là .
  • merci c'est gentil, de toutes les façon il est l'heure zzz
  • CéroceCéroce Membre, Modérateur
    'jpimbert' a écrit:


    Il semblerait que les Enum qui existaient en Carbon n'aient pas été intégrés dans Cocoa. Le plus simple est de les refaire soi même.


    Les codes sont dans le framework HIToolbox/Events.h

    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h



    Pour un projet, je les avais effectivement extraits:
    <br />
    enum {<br />
        kVK_Return				    = 0x24,<br />
        kVK_Tab					   = 0x30,<br />
        kVK_Space					 = 0x31,<br />
        kVK_Delete				    = 0x33,<br />
        kVK_Escape				    = 0x35,<br />
        kVK_Command				   = 0x37,<br />
        kVK_Shift					 = 0x38,<br />
        kVK_CapsLock				  = 0x39,<br />
        kVK_Option				    = 0x3A,<br />
        kVK_Control				   = 0x3B,<br />
        kVK_RightShift			    = 0x3C,<br />
        kVK_RightOption			   = 0x3D,<br />
        kVK_RightControl			  = 0x3E,<br />
        kVK_Function				  = 0x3F,<br />
        kVK_F17					   = 0x40,<br />
        kVK_VolumeUp				  = 0x48,<br />
        kVK_VolumeDown			    = 0x49,<br />
        kVK_Mute					  = 0x4A,<br />
        kVK_F18					   = 0x4F,<br />
        kVK_F19					   = 0x50,<br />
        kVK_F20					   = 0x5A,<br />
        kVK_F5					    = 0x60,<br />
        kVK_F6					    = 0x61,<br />
        kVK_F7					    = 0x62,<br />
        kVK_F3					    = 0x63,<br />
        kVK_F8					    = 0x64,<br />
        kVK_F9					    = 0x65,<br />
        kVK_F11					   = 0x67,<br />
        kVK_F13					   = 0x69,<br />
        kVK_F16					   = 0x6A,<br />
        kVK_F14					   = 0x6B,<br />
        kVK_F10					   = 0x6D,<br />
        kVK_F12					   = 0x6F,<br />
        kVK_F15					   = 0x71,<br />
        kVK_Help					  = 0x72,<br />
        kVK_Home					  = 0x73,<br />
        kVK_PageUp				    = 0x74,<br />
        kVK_ForwardDelete			 = 0x75,<br />
        kVK_F4					    = 0x76,<br />
        kVK_End					   = 0x77,<br />
        kVK_F2					    = 0x78,<br />
        kVK_PageDown				  = 0x79,<br />
        kVK_F1					    = 0x7A,<br />
        kVK_LeftArrow				 = 0x7B,<br />
        kVK_RightArrow			    = 0x7C,<br />
        kVK_DownArrow				 = 0x7D,<br />
        kVK_UpArrow				   = 0x7E<br />
    };<br />
    
Connectez-vous ou Inscrivez-vous pour répondre.