2017-01-30 4 views
10

मैं एक विनफॉर्म एप्लिकेशन के अंदर अपने ediatble क्षेत्र में कोरियाई पाठ टाइप करना चाहता हूँ।Winform में कोरियाई इनपुट कैसे लें?

लेकिन वर्ण दोहरा रहे हैं, मैं डिफ़ॉल्ट WndProc, लेकिन कुछ भी काम कर रहे ओवरराइड करने के लिए कोशिश की है।

switch (m.WParam.ToInt32()) 
       { 
case Common.Interop.Window.WM_IME_CHAR: 
       break; 

      case Common.Interop.Window.WM_IME_ENDCOMPOSITION: 
        PassCharToScreen(m); 
       break; 

      case Common.Interop.Window.WM_CHAR: 
        PassCharToScreen(m); 
       break; 

      case Common.Interop.Window.WM_IME_NOTIFY: 
       break; 
      case Common.Interop.Window.WM_IME_COMPOSITION: 
       PassCharToScreen(m); 
       break; 
      case Common.Interop.Window.WM_IME_COMPOSITIONFULL: 
       break; 

जब मैं अंग्रेजी में टाइप करें, ब्रेकपाइंट हिट WM_CHAR, लेकिन जब मैं कोरियाई में टाइप यह पहली चरित्र पर WM_IME_COMPOSITION मारता है, और उसके बाद पहले वर्ण के बाद यह WM_IME_COMPOSITION पहले हिट और फिर WM_CHAR पूरी करता है।

मैंने देखा है कि यह पहला चरित्र सही टाइप करता है। उदा। ㅁ (कोरियाई कैरेक्टर) दूसरे अक्षर टाइप करने पर। ㅁㅂㅁ (पहला चार, दूसरा चार, पहला चार)। मुझे व्यवहार चाहिए क्योंकि यह नोटपैड

+0

स्विच स्टेटमेंट भी दिखाएं। –

+2

शायद यह लिंक आपकी मदद करेगा। http://stackoverflow.com/questions/3287180/putting-ime-in-a-custom-text-box-derived-from-control –

+0

यह किस प्रकार का नियंत्रण है? मानक 'टेक्स्टबॉक्स'? क्या यह किसी भी तरह से उपclassed है? क्योंकि अन्यथा यह ठीक काम करना चाहिए। नोटपैड में टेक्स्ट एरिया एक सादे ईडीआईटी नियंत्रण पर भी आधारित है, जिसने डिफ़ॉल्ट रूप से सभी आवश्यक आईएमई सामानों को तार दिया है। डब्ल्यूपीएफ एक अलग कहानी होगी, लेकिन WinForms नहीं। – dlatikay

उत्तर

0

मैंने किसी भी तरह से इस मुद्दे को हल किया है, मैं दूसरों की मदद करने के लिए यहां लिख रहा हूं। कोड में कोई बग है तो कृपया मुझे बताएं।

private bool mIsImeProcessed = true; 
private bool mIsImeContinue = false; 

case WM_IME_COMPOSITION: 
       { 
        if (mKoreanInput == true) 
        { 
         long lParam = m.LParam.ToInt64(); 
         long wParam = m.WParam.ToInt64(); 
         char c = (char)m.WParam; 
         if (lParam == 24600) 
         { 
          if (mIsImeProcessed) 
          { 
           mIsImeProcessed = false; 
           mIsImeContinue = false; 
           PassCharToThirdParty(m); 
          } 
          else 
          { 
           PassCharToThirdPartyWithBackSpace(((char)m.WParam).ToString()); 
          } 
          mIsImeContinue = true; 
         } 
        } 
        else if (lParam == 2048) 
        { 
         if (mIsImeProcessed) 
         { 
         } 
         else 
         { 
          if (mIsImeContinue == true) 
          { 

           PassCharToThirdPartyWithBackSpace(((char)m.WParam).ToString()); 
          } 
         } 

         mIsImeProcessed = true; 

        } 
        else 
        { 
          PassBackSpaceToThirdParty(); 
        } 
       } 
       break; 
case Common.Interop.Window.WM_IME_ENDCOMPOSITION: 
       if (mKoreanInput == true) 
       { 
        mIsImeProcessed = true; 
        mIsImeContinue = false; 
       } 
       break; 

पहले जांच करें कि भाषा कोरियाई या अन्य भाषा है, तो यदि कोरियाई आपको इसे अलग-अलग संभालना है।

आप प्रारंभ की जानकारी और समाप्ति रचना प्राप्त करने के लिए और आप हमेशा चरित्र या रचना की अपनी निरंतरता जांच करने के लिए किया है। mIsImeProcessedfalse को true करने और mIsImeContinue सेट एक बार आप WndProc में रचना की समाप्ति मिलता है।

हमें बैकस्पेस के लिए भी केस को संभालने की आवश्यकता है।