2011-11-24 19 views
7

Tengo un código que he estado usando para obtener el diseño del teclado actual y convertir un código de clave virtual en una cadena. Esto funciona muy bien en la mayoría de las situaciones, pero estoy teniendo problemas con algunos casos específicos. El que lo sacó a la luz es la tecla de acento junto a la tecla de retroceso en los teclados QWERTZ alemanes. http://en.wikipedia.org/wiki/File:KB_Germany.svgConvertir código de clave virtual a cadena Unicode

Esa clave genera el código VK que esperaría kVK_ANSI_Equal, pero cuando uso un teclado QWERTZ no obtengo ninguna descripción. Está terminando como una tecla muerta porque se supone que debe estar compuesta con otra tecla. ¿Hay alguna manera de atrapar estos casos y hacer la conversión adecuada?

Mi código actual está por debajo.

TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); 
CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData); 
const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr); 

if(keyboardLayout) 
{ 
    UInt32 deadKeyState = 0; 
    UniCharCount maxStringLength = 255; 
    UniCharCount actualStringLength = 0; 
    UniChar unicodeString[maxStringLength]; 

    OSStatus status = UCKeyTranslate(keyboardLayout, 
            keyCode, kUCKeyActionDown, 0, 
            LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit, 
            &deadKeyState, 
            maxStringLength, 
            &actualStringLength, unicodeString); 

    if(actualStringLength > 0 && status == noErr) 
     return [[NSString stringWithCharacters:unicodeString length:(NSInteger)actualStringLength] uppercaseString]; 
} 
+1

en caso de que no se establece kUCKeyTranslateNoDeadKeysMask en lugar de kUCKeyTranslateNoDeadKeysBit, ya que este último se define como 0, mientras que el primero es una máscara con que en realidad poco habilitada? – rdb

Respuesta

13

Esa llave es una tecla muerta, como se puede ver si se intenta usted mismo o mirar el Visor de Teclado con el trazado alemán activo.

En la Mac, la forma de ingresar el carácter real de una tecla muerta, sin componerlo con otro personaje, es presionar un espacio después de ella. Intente así: Desactive kUCKeyTranslateNoDeadKeysBit, y si UCKeyTranslate establece el estado de tecla muerta, traduzca un espacio después de él.

EDITAR (añadido por el autor de la pregunta)

Sólo por la gente del futuro, aquí está el código fija con la solución correcta.

TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); 
CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData); 
const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr); 

if(keyboardLayout) 
{ 
    UInt32 deadKeyState = 0; 
    UniCharCount maxStringLength = 255; 
    UniCharCount actualStringLength = 0; 
    UniChar unicodeString[maxStringLength]; 

    OSStatus status = UCKeyTranslate(keyboardLayout, 
            keyCode, kUCKeyActionDown, 0, 
            LMGetKbdType(), 0, 
            &deadKeyState, 
            maxStringLength, 
            &actualStringLength, unicodeString); 

    if (actualStringLength == 0 && deadKeyState) 
    { 
     status = UCKeyTranslate(keyboardLayout, 
             kVK_Space, kUCKeyActionDown, 0, 
             LMGetKbdType(), 0, 
             &deadKeyState, 
             maxStringLength, 
             &actualStringLength, unicodeString); 
    } 
    if(actualStringLength > 0 && status == noErr) 
     return [[NSString stringWithCharacters:unicodeString length:(NSUInteger)actualStringLength] uppercaseString]; 
} 
+0

Este código es para traducciones de enlace de clave. Entonces, esa clave se puede usar fuera de la tipificación normal en este contexto. Lo estoy tomando en el nivel de HID, pero necesito una forma de mostrarle al usuario qué tecla está vinculada. ¿Cómo puedo decir que para un diseño QWERTZ, esa clave virtual es esa teclacap? –

+0

Aquí está el código fijo, muchas gracias Peter, https://github.com/OpenEmu/OpenEmu/commit/a59dddfa669ab0e2872f79a6443c45e2a2d87253 –

+0

@JoshuaWeinberg: Corregí el código que agregaste a mi respuesta; tu lanzaste la longitud al tipo equivocado. –

Cuestiones relacionadas