2011-11-24 43 views
7

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

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

Trả lời

13

Đó chính một chìa khóa chết, như bạn có thể thấy nếu bạn thử nó cho mình hoặc nhìn vào bàn phím Viewer với cách bố trí của Đức hoạt động.

Trên máy Mac, cách nhập ký tự thực tế của một khóa chết, mà không cần tạo ký tự đó với một ký tự khác, là nhấn một dấu cách sau ký tự đó. Vì vậy, hãy thử điều đó: Tắt kUCKeyTranslateNoDeadKeysBit và nếu UCKeyTranslate đặt trạng thái chết, hãy dịch khoảng trắng sau đó.

EDIT (thêm vào bằng cách hỏi)

Chỉ cần cho người dân trong tương lai, đây là mã cố định với các giải pháp đúng.

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

Mã này dành cho các bản dịch ràng buộc chính. Vì vậy, đó là chìa khóa có thể sử dụng bên ngoài gõ bình thường trong bối cảnh này. Tôi đang lấy nó ở cấp độ HID, nhưng tôi cần một cách để hiển thị cho người dùng những gì chính là ràng buộc. Làm cách nào để tôi biết điều đó cho bố cục QWERTZ, khóa ảo đó là keycap? –

+0

Đây là mã cố định, cảm ơn bạn rất nhiều Peter, https://github.com/OpenEmu/OpenEmu/commit/a59dddfa669ab0e2872f79a6443c45e2a2d87253 –

+0

@JoshuaWeinberg: Tôi đã sửa mã bạn thêm vào câu trả lời của mình; bạn truyền độ dài cho loại sai. –

Các vấn đề liên quan