ฉันมีรหัสบางส่วนที่ใช้เพื่อรับรูปแบบแป้นพิมพ์ปัจจุบันและแปลงรหัสคีย์เสมือนเป็นสตริง วิธีนี้ใช้ได้ผลดีในสถานการณ์ส่วนใหญ่ แต่ฉันประสบปัญหากับบางกรณีโดยเฉพาะ สิ่งที่ทำให้สิ่งนี้ชัดเจนคือปุ่มเน้นเสียงที่อยู่ถัดจากปุ่ม Backspace บนแป้นพิมพ์ QWERTZ ภาษาเยอรมัน http://en.wikipedia.org/wiki/File:KB_Germany.svg
คีย์นั้นจะสร้างโค้ด VK ที่ฉันคาดหวังไว้ kVK_ANSI_Equal
แต่เมื่อใช้รูปแบบแป้นพิมพ์ QWERTZ ฉันจะไม่ได้รับคำอธิบายกลับมา มันลงเอยด้วยการเป็นคีย์ที่ตายแล้ว เพราะมันควรจะประกอบด้วยคีย์อื่น มีวิธีใดบ้างที่จะจับกรณีเหล่านี้และทำการแปลงอย่างเหมาะสม?
รหัสปัจจุบันของฉันอยู่ด้านล่าง
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];
}