ठीक है, ऐसा लगता है कि स्टैक ओवरफ्लो पर कई आईएमई विशेषज्ञ नहीं हैं ... या कोई भी दिलचस्पी नहीं लेता है।
वैसे भी, मैंने इसे समझ लिया।
असल में, मैं जाल के लिए निम्न विंडोज संदेश:
WM_INPUTLANGCHANGE = 0x51
WM_KEYUP = 0x101
WM_CHAR = 0x102
WM_CONVERTREQUESTEX = 0x108
WM_IME_STARTCOMPOSITION = 0x10D
WM_IME_ENDCOMPOSITION = 0x10E
WM_IME_COMPOSITION = 0x10F
WM_IME_SETCONTEXT = 0x281
WM_IME_NOTIFY = 0x282
WM_IME_CONTROL = 0x283
WM_IME_COMPOSITIONFULL = 0x284
WM_IME_SELECT = 0x285
WM_IME_CHAR = 0x286
WM_IME_REQUEST = 0x0288
WM_IME_KEYDOWN = 0x290
WM_IME_KEYUP = 0x291
मैं WM_KEYUP
और WM_CHAR
फँसाने रहा हूँ, क्योंकि अगर मैं एक कोरियाई चरित्र संयोजन के बीच में कहीं पर क्लिक करें, मैं एक संरचना नहीं मिलता है संदेश, लेकिन मुझे उस चरित्र को मेरे टेक्स्ट बॉक्स में फिर भी जोड़ने की ज़रूरत है। यह एक अजीब व्यवहार है, मुझे आश्चर्य है कि यह एक बग है।
एक बार ऐसा होता है, कोरियाई, चीनी और जापानी के बीच अलग-अलग व्यवहार होते हैं।
कोरियाई वास्तव में एक आसान है (मुझे हांजा कनवर्ट करने के बारे में निश्चित नहीं है, क्योंकि मुझे नहीं पता कि वैसे भी इसका उपयोग कैसे करें)।
असल में, सभी भाषाओं के लिए, जब भी मुझे WM_IME_COMPOSITION
मिलता है, मुझे को Imm32.dll में कॉल करना होगा जैसा कि मैंने this question के उत्तर में वर्णित किया है। मैं इसे प्रगति पर एक रचना के रूप में प्रदर्शित करता हूं, लेकिन इसे अपने संग्रहीत पाठ में नहीं जोड़ता हूं।
जब एक स्ट्रिंग को मिश्रित किया गया है तो प्रत्येक आईएमई के लिए विंडोज से संदेश अलग है। हर बार, मैं इसे WM_IME_COMPOSITION
संदेश से प्राप्त कर सकता हूं।
कोरियाई में, LParam
बस GCS_RESULTSTR
हो जाएगा, और WParam
में प्रवेश किया चरित्र है, जो मैं सिर्फ char
पर कास्ट कर सकते जापानी 'lParam' में GCS_RESULTREADSTR | GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE
हो जाएगा हो जाएगा। मुझे ImmGetCompositionString
के परिणाम का उपयोग करना है जिसे मैंने पिछले WM_IME_COMPOSITION संदेश से संग्रहीत किया था, क्योंकि इस समय यह एक खाली स्ट्रिंग होगी।
चीनी में, LParam
GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE
होगा। यह जापानी जैसा ही है, सिवाय इसके कि पहले संग्रहीत ImmGetCompositionString
खाली है, इस स्थिति में मुझे WParam
को चार में डालना होगा।
सभी तीन मामलों में, मुझे यह सुनिश्चित करना होगा कि प्रगति में मेरा प्रदर्शित कंप साफ़ हो गया है।
मैं WM_IME_STARTCOMPOSITION
प्राप्त करते हैं, मैं एक संयोजन ध्वज सेट (और प्रगति में संयोजन स्ट्रिंग प्रदर्शित)
मैं WM_IME_ENDCOMPOSITION
मिले, तो मुझे लगता है कि झंडा स्पष्ट (और प्रगति में संयोजन स्ट्रिंग साफ़ करें)।
कभी-कभी मुझे WM_IME_ENDCOMPOSITION
प्राप्त नहीं होता है, इसलिए मैं WM_CHAR
प्राप्त करने पर अपना ध्वज साफ़ करता हूं।
सभी सब में, यह एक बहुत ही दिलचस्प अधिगम अनुभव है, और एक अभी भी प्रगति पर है कि था - लेकिन IME पिछले पर अब, मेरे नियंत्रण पर प्रयोग करने योग्य है! मैं इसे पूरा करने के लिए 1 बजे तक काम पर रहा।
बस पाया गया http://stackoverflow.com/questions/434048/how-do-you-use-ime, पहले देखा होगा अच्छा होगा! –