2010-03-06 8 views
5

प्राप्त करना मैं एक उदाहरण के रूप में जापानी आईएमई का उपयोग कर रहा हूं लेकिन यह शायद अन्य भाषाओं में समान है जो इनपुट के लिए आईएमई का उपयोग करते हैं।सी # और आईएमई - वर्तमान इनपुट टेक्स्ट

जब उपयोगकर्ता आईएमई का उपयोग कर टेक्स्टबॉक्स में टेक्स्ट टाइप करता है, तो KeyDown और KeyUp ईवेंट निकाल दिए जाते हैं। हालांकि टेक्स्टबॉक्स। टेक्स्ट प्रॉपर्टी टाइप किए गए टेक्स्ट को तब तक नहीं लौटाती जब तक कि उपयोगकर्ता ने एंटर कुंजी का उपयोग करके आईएमई में इनपुट को मान्य नहीं किया हो।

तो उदाहरण के लिए यदि उपयोगकर्ता 5 गुणा types टाइप करता है तो मान्य करता है, मुझे प्रत्येक बार टेक्स्टबॉक्स के साथ 5 कीडाउन/कीप घटनाएं मिलेंगी। पाठ वापस लौटने के बाद (खाली स्ट्रिंग) और अंत में मुझे एक कीडाउन/एंटर कुंजी और टेक्स्टबॉक्स के लिए कीप। टेक्स्ट सीधे "あ あ あ あ あ" बन जाएगा।

उपयोगकर्ता टाइपिंग करते समय उपयोगकर्ता इनपुट कैसे प्राप्त कर सकता है, उपयोगकर्ता अंत में मान्य होने से पहले?

(मैं कैसे एक वेब पेज पर एक < इनपुट > मैदान पर जावास्क्रिप्ट में यह करने के लिए पता है, तो यह सी # में संभव होना चाहिए!)

+1

क्या यह विंडोज़ में है? यदि हां, तो आप WM_IME_COMPOSITION Messsage को रोक सकते हैं और उपयोगकर्ता इनपुट प्राप्त करने के लिए ImmGetCompositionString का उपयोग कर सकते हैं। – Dian

उत्तर

7

आप इस का उपयोग कर सकते हैं वर्तमान संरचना प्राप्त करने के लिए। यह किसी भी रचना स्थिति में और जापानी, चीनी और कोरियाई के लिए काम करेगा। मैंने केवल विंडोज 7 पर इसका परीक्षण किया है, इसलिए सुनिश्चित नहीं है कि यह विंडोज के अन्य संस्करणों पर काम करेगा।

चीजों के समान होने के साथ ही, चीजें वास्तव में तीनों के बीच बहुत अलग हैं।

using System.Text; 
using System; 
using System.Runtime.InteropServices; 

namespace Whatever { 
    public class GetComposition { 
     [DllImport("imm32.dll")] 
     public static extern IntPtr ImmGetContext(IntPtr hWnd); 
     [DllImport("Imm32.dll")] 
     public static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC); 
     [DllImport("Imm32.dll", CharSet = CharSet.Unicode)] 
     private static extern int ImmGetCompositionStringW(IntPtr hIMC, int dwIndex, byte[] lpBuf, int dwBufLen); 

     private const int GCS_COMPSTR = 8; 

     /// IntPtr handle is the handle to the textbox 
     public string CurrentCompStr(IntPtr handle) { 
      int readType = GCS_COMPSTR; 

      IntPtr hIMC = ImmGetContext(handle); 
      try { 
       int strLen = ImmGetCompositionStringW(hIMC, readType, null, 0); 

       if (strLen > 0) { 
        byte[] buffer = new byte[strLen]; 

        ImmGetCompositionStringW(hIMC, readType, buffer, strLen); 

        return Encoding.Unicode.GetString(buffer); 

       } else { 
        return string.Empty; 
       } 
      } finally { 
       ImmReleaseContext(handle, hIMC); 
      } 
     } 
    } 
} 

अन्य कार्यान्वयन मैं एक StringBuilder इस्तेमाल किया देखा है, लेकिन यह, एक बाइट सरणी का उपयोग करने के क्योंकि एस.बी. आमतौर पर इसमें कुछ बकवास के साथ अंत के साथ ही होगा बेहतर है। बाइट सरणी यूटीएफ 16 में एन्कोड किया गया है।

और आमतौर पर, जब भी आपको "WM_IME_COMPOSITION" संदेश प्राप्त होता है तो आप GetComposition को कॉल करना चाहते हैं क्योंकि डियान ने कहा था।

ImmGetContext को कॉल करने के बाद ImmReleaseContext को कॉल करना बहुत महत्वपूर्ण है, यही कारण है कि यह अंततः ब्लॉक में है।

+0

(वाई) धन्यवाद आदमी। –

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