2012-09-22 29 views
5

¿Cómo puedo convertir un código clave, tales como kVK_ANSI_1 en una cadena que me puede pasar a setKeyEquivalent (por lo que para kVK_ANSI_1, me gustaría obtener @"1")? ¿Y por qué hay dos formas de especificar claves de todos modos? Tendría más sentido tener una sola representación.Convertir código de llave en cadena equivalente clave

+1

Hay dos formas de especificar claves porque 'kVK_ANSI_1' representa una posición en el teclado (donde se encuentra la tecla "1" en un teclado estándar ANSI de EE.UU.), mientras que "1" representa el carácter escrito (que puede o no venir de 'kVK_ANSI_1', dependiendo de la distribución del teclado). – jlstrecker

Respuesta

5

Terminé usando la siguiente función encontré here.

/* Returns string representation of key, if it is printable. 
* Ownership follows the Create Rule; that is, it is the caller's 
* responsibility to release the returned object. */ 
CFStringRef createStringForKey(CGKeyCode keyCode) 
{ 
    TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); 
    CFDataRef layoutData = 
     TISGetInputSourceProperty(currentKeyboard, 
            kTISPropertyUnicodeKeyLayoutData); 
    const UCKeyboardLayout *keyboardLayout = 
     (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData); 

    UInt32 keysDown = 0; 
    UniChar chars[4]; 
    UniCharCount realLength; 

    UCKeyTranslate(keyboardLayout, 
        keyCode, 
        kUCKeyActionDisplay, 
        0, 
        LMGetKbdType(), 
        kUCKeyTranslateNoDeadKeysBit, 
        &keysDown, 
        sizeof(chars)/sizeof(chars[0]), 
        &realLength, 
        chars); 
    CFRelease(currentKeyboard);  

    return CFStringCreateWithCharacters(kCFAllocatorDefault, chars, 1); 
} 
+0

impresionante y útil (incluso tan tarde). Gracias – Terminality

Cuestiones relacionadas