J'ai du code que j'ai utilisé pour obtenir la disposition de clavier actuelle et convertir un code de clé virtuelle en une chaîne. Cela fonctionne très bien dans la plupart des situations, mais j'ai des problèmes avec certains cas spécifiques. Celui qui a mis cela en évidence est la touche d'accentuation à côté de la touche de retour arrière sur les claviers allemands QWERTZ. Cette clé génère le code VK auquel je m'attendrais kVK_ANSI_Equal
mais lorsque j'utilise une disposition de clavier QWERTZ, je n'ai pas de description en retour. Il finit comme une clé morte car il est censé être composé avec une autre clé. Y at-il un moyen d'attraper ces cas et faire la conversion appropriée?Convertir le code de clé virtuelle en chaîne unicode
Mon code actuel est ci-dessous.
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];
}
Si vous définissez pas kUCKeyTranslateNoDeadKeysMask au lieu de kUCKeyTranslateNoDeadKeysBit, puisque celui-ci est défini comme 0 alors que le premier est un masque avec ce bit réellement activé? – rdb