Ho un codice che ho utilizzato per ottenere il layout corrente della tastiera e convertire un codice tasto virtuale in una stringa. Funziona alla grande nella maggior parte delle situazioni, ma ho problemi con alcuni casi specifici. Quello che ha portato alla luce questo è il tasto accento accanto al tasto backspace sulle tastiere tedesche QWERTZ. http://en.wikipedia.org/wiki/File:KB_Germany.svgConverti codice chiave virtuale in stringa unicode
Quella chiave genera il codice VK mi aspetto kVK_ANSI_Equal
ma quando si utilizza un layout di tastiera QWERTZ ottengo nessuna descrizione indietro. È finito come una chiave morta perché dovrebbe essere composto con un'altra chiave. C'è un modo per catturare questi casi e fare la conversione corretta?
Il mio codice attuale è sotto.
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];
}
non si dovrebbe impostare kUCKeyTranslateNoDeadKeysMask invece di kUCKeyTranslateNoDeadKeysBit, in quanto quest'ultima è definita come 0, mentre il primo è una maschera con quel po 'in realtà è abilitato? – rdb