2011-11-24 65 views
7

我有一些代碼,我一直在使用獲取當前的鍵盤佈局,並將虛擬鍵碼轉換爲字符串。這在大多數情況下效果很好,但我在某些特定情況下遇到問題。讓這個燈亮的是德國QWERTZ鍵盤上退格鍵旁邊的重音鍵。 http://en.wikipedia.org/wiki/File:KB_Germany.svg轉換虛擬鍵碼到Unicode字符串

該鍵生成的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]; 
} 
+1

如果您沒有設置kUCKeyTranslateNoDeadKeysMask代替kUCKeyTranslateNoDeadKeysBit,因爲而前者與該位掩碼啓用實際上後者被定義爲0? – rdb

回答

13

這關鍵一個死鍵,你可以看到,如果你自己嘗試一下或看與德國積極佈局的鍵盤顯示程序。

在Mac上,輸入死鎖的實際字符而不用另一個字符組成的方法是在其後按空格。因此請嘗試:關閉kUCKeyTranslateNoDeadKeysBit,如果UCKeyTranslate設置了死鎖狀態,請在它後面翻譯一個空格。

編輯(由提問者加)

只是爲了未來的人來說,這裏是正確的解決方案的固定代碼。

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

此代碼用於密鑰綁定翻譯。因此,在這種情況下,密鑰在正常輸入之外是可用的。我在HID級別上抓住它,但我需要一種方式向用戶展示綁定的密鑰。我如何知道對於QWERTZ佈局,該虛擬鍵是那個鍵帽? –

+0

這裏是固定的代碼,非常感謝Peter,https://github.com/OpenEmu/OpenEmu/commit/a59dddfa669ab0e2872f79a6443c45e2a2d87253 –

+0

@JoshuaWeinberg:我更正了你添加到我的答案中的代碼;您將長度轉換爲錯誤的類型。 –