Saya memiliki beberapa kode yang saya gunakan untuk mendapatkan tata letak keyboard saat ini dan mengubah kode kunci virtual menjadi string. Ini berfungsi dengan baik di sebagian besar situasi, tetapi saya mengalami masalah dengan beberapa kasus tertentu. Salah satu yang memperjelas hal ini adalah tombol aksen di sebelah tombol spasi mundur pada keyboard QWERTZ Jerman. http://en.wikipedia.org/wiki/File:KB_Germany.svg
Kunci itu menghasilkan kode VK yang saya harapkan kVK_ANSI_Equal
tetapi ketika menggunakan tata letak keyboard QWERTZ saya tidak mendapatkan deskripsi apa pun. Ini berakhir sebagai kunci mati karena seharusnya dibuat dengan kunci lain. Apakah ada cara untuk mengetahui kasus ini dan melakukan konversi yang tepat?
Kode saya saat ini ada di bawah.
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];
}