Tôi có một số mã tôi đã sử dụng để có bố cục bàn phím hiện tại và chuyển đổi mã khóa ảo thành chuỗi. Điều này hoạt động tốt trong hầu hết các trường hợp, nhưng tôi đang gặp sự cố với một số trường hợp cụ thể. Một trong đó mang lại ánh sáng này là phím nhấn bên cạnh phím backspace trên bàn phím QWERTZ của Đức. http://en.wikipedia.org/wiki/File:KB_Germany.svgChuyển đổi mã khóa ảo thành mã unicode
Phím đó tạo mã VK mà tôi mong đợi kVK_ANSI_Equal
nhưng khi sử dụng bố cục bàn phím QWERTZ, tôi không nhận được mô tả nào. Kết thúc của nó như là một chìa khóa chết vì nó được cho là được sáng tác với một khóa khác. Có cách nào để bắt những trường hợp này và thực hiện chuyển đổi thích hợp không?
Mã hiện tại của tôi ở bên dưới.
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];
}
nên bạn không được thiết lập kUCKeyTranslateNoDeadKeysMask thay vì kUCKeyTranslateNoDeadKeysBit, vì sau này được xác định là 0 trong khi trước đây là một chiếc mặt nạ với chút mà thực sự kích hoạt? – rdb