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];
}
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