好吧,看起來好像StackOverflow上沒有很多IME專家......或者沒有人有興趣。
無論如何,我想通了。
基本上,我有陷阱以下Windows消息:
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
,我有我的答案已經描述this question調用ImmGetCompositionString
在Imm32.dll。然後我將其顯示爲正在撰寫的作文,但不要將其添加到我存儲的文本中。
當合成字符串時,來自Windows的消息對於每個IME都是不同的。每次,我都可以從WM_IME_COMPOSITION
消息中得到它。
在韓國,LParam
將只是GCS_RESULTSTR
和WParam
將輸入的字符,我可以只投給char
在日本「Lparam型」將是GCS_RESULTREADSTR | GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE
。我必須使用從先前的WM_IME_COMPOSITION消息中存儲的ImmGetCompositionString
的結果,因爲此時它將是一個空字符串。
中文中,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,早就看到了! – 2010-07-21 02:00:08