2011-11-24 14 views
7

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

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

Odpowiedz

13

To jest klucz martwy klucz, jak widać, jeśli spróbujesz to sam lub patrzeć na widza klawiatura z niemieckiego układu aktywnego.

Na Macu sposobem na wpisanie rzeczywistego charakteru martwego klucza, bez komponowania go z innym znakiem, jest naciśnięcie spacji za nim. Spróbuj więc: Wyłącz kUCKeyTranslateNoDeadKeysBit, a jeśli UCKeyTranslate ustawi stan martwego klucza, przetłumacz po nim spację.

EDIT (dodane przez pytającego)

Tylko dla przyszłych ludzi, tutaj jest stały kod z odpowiednim roztworze.

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

Ten kod służy do tłumaczenia wiążących klawiszy. Tak więc ten klucz jest użyteczny poza normalnym pisaniem w tym kontekście. Chwytam go na poziomie HID, ale potrzebuję sposobu, aby pokazać użytkownikowi, jaki klucz jest związany. Jak mogę powiedzieć, że dla układu QWERTZ ten klucz wirtualny jest tym kluczem? –

+0

Oto ustalony kod, bardzo dziękuję Peter, https://github.com/OpenEmu/OpenEmu/commit/a59dddfa669ab0e2872f79a6443c45e2a2d87253 –

+0

@JoshuaWeinberg: Poprawiłem kod dodany do mojej odpowiedzi; rzucasz długość na niewłaściwy typ. –

Powiązane problemy