2012-09-22 11 views
5

kVK_ANSI_1などのキーコードをsetKeyEquivalentに渡すことができる文字列に変換するにはどうすればよいですか(kVK_ANSI_1の場合、@"1"を取得します)。とにかくキーを指定する2つの方法は何故ですか?ただ一つの表現を持つほうが意味があります。キーコードをキーと同等の文字列に変換する

+1

'kVK_ANSI_1'は、キーボード上の位置を表すので、「1」(文字が入力を表すのに対し、キーを指定するには2つの方法が、(「1」キーはANSI標準のUSキーボードの上に置かれている場所)がありますあなたのキーボードレイアウトに応じて 'kVK_ANSI_1'から来るかもしれません)。 – jlstrecker

答えて

5

後、私は次の関数を使用して終了さはhereを見つけました。

/* Returns string representation of key, if it is printable. 
* Ownership follows the Create Rule; that is, it is the caller's 
* responsibility to release the returned object. */ 
CFStringRef createStringForKey(CGKeyCode keyCode) 
{ 
    TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); 
    CFDataRef layoutData = 
     TISGetInputSourceProperty(currentKeyboard, 
            kTISPropertyUnicodeKeyLayoutData); 
    const UCKeyboardLayout *keyboardLayout = 
     (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData); 

    UInt32 keysDown = 0; 
    UniChar chars[4]; 
    UniCharCount realLength; 

    UCKeyTranslate(keyboardLayout, 
        keyCode, 
        kUCKeyActionDisplay, 
        0, 
        LMGetKbdType(), 
        kUCKeyTranslateNoDeadKeysBit, 
        &keysDown, 
        sizeof(chars)/sizeof(chars[0]), 
        &realLength, 
        chars); 
    CFRelease(currentKeyboard);  

    return CFStringCreateWithCharacters(kCFAllocatorDefault, chars, 1); 
} 
+0

素晴らしいと便利です(これは遅くても)。ありがとう – Terminality

関連する問題