Mam kod, którego używam, aby uzyskać aktualny układ klawiatury i przekonwertować kod klucza wirtualnego na ciąg znaków. Działa to świetnie w większości sytuacji, ale mam problemy z niektórymi przypadkami. Ten, który ją wyeksponował, to klawisz akcentujący obok klawisza Backspace na niemieckich klawiaturach QWERTZ. http://en.wikipedia.org/wiki/File:KB_Germany.svgKonwertuj kod wirtualnego klucza na ciąg znaków Unicode
Ten klucz generuje kod VK, którego oczekiwałbym kVK_ANSI_Equal
, ale przy korzystaniu z układu klawiatury QWERTZ nie otrzymuję żadnego opisu. Kończy się jako martwy klucz, ponieważ ma być skomponowany z innym kluczem. Czy istnieje sposób, aby złapać te przypadki i dokonać właściwej konwersji?
Mój obecny kod znajduje się poniżej.
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];
}
Jeśli nie ustawiono kUCKeyTranslateNoDeadKeysMask zamiast kUCKeyTranslateNoDeadKeysBit, ponieważ jest ona definiowana jako 0, podczas gdy pierwsza jest maska z tego kawałka faktycznie włączone? – rdb