2011-11-24 10 views
7

में कनवर्ट करें मेरे पास कुछ कोड है जो मैं वर्तमान कीबोर्ड लेआउट प्राप्त करने और वर्चुअल कुंजी कोड को स्ट्रिंग में कनवर्ट करने के लिए उपयोग कर रहा हूं। यह ज्यादातर स्थितियों में बहुत अच्छा काम करता है, लेकिन मुझे कुछ विशिष्ट मामलों में परेशानी हो रही है। जिसने इसे प्रकाश में लाया वह जर्मन QWERTZ कीबोर्ड पर बैकस्पेस कुंजी के बगल में उच्चारण कुंजी है। http://en.wikipedia.org/wiki/File:KB_Germany.svgवर्चुअल कुंजी कोड को यूनिकोड स्ट्रिंग

वह कुंजी वीके कोड उत्पन्न करती है जिसे मैं 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

आप kUCKeyTranslateNoDeadKeysBit के बजाय kUCKeyTranslateNoDeadKeysMask सेट नहीं करना चाहिए, पूर्व कि बिट के साथ एक मुखौटा वास्तव में सक्षम किया गया है, जबकि बाद से बाद के 0 के रूप में परिभाषित किया गया है? – rdb

उत्तर

13

कुंजी यही एक मरे हुए कुंजी है, जैसा कि आप अगर आप इसे अपने आप को कोशिश या जर्मन लेआउट सक्रिय साथ कीबोर्ड व्यूअर को देखो देख सकते हैं।

मैक पर, किसी मृत चरित्र के वास्तविक चरित्र को दर्ज करने का तरीका, इसे किसी अन्य चरित्र के साथ लिखने के बिना, इसके बाद एक स्थान दबा देना है। तो इसे आज़माएं: 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

यह कोड कुंजी बाध्यकारी अनुवाद के लिए है। तो यह संदर्भ इस संदर्भ में सामान्य टाइपिंग के बाहर प्रयोग योग्य है। मैं इसे छुपा स्तर पर पकड़ रहा हूं, लेकिन मुझे उपयोगकर्ता को दिखाने के लिए एक तरीका चाहिए कि कौन सी कुंजी बाध्य है। मैं इसे QWERTZ लेआउट के लिए कैसे कहूं, वह वर्चुअल कुंजी वह कीपैप है? –

+0

यहां निश्चित कोड है, आपको बहुत धन्यवाद पीटर, https://github.com/OpenEmu/OpenEmu/commit/a59dddfa669ab0e2872f79a6443c45e2a2d87253 –

+0

@ जोशुआ वेनबर्ग: मैंने आपके उत्तर में जो कोड जोड़ा है उसे सही किया; आप लंबाई को गलत प्रकार में डाल देते हैं। –

संबंधित मुद्दे