OK, parece que no hay muchos expertos IME en StackOverflow ... o nadie está interesado.
De todos modos, lo descubrí.
Básicamente, tengo que atrapar a los siguientes mensajes de 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
estoy atrapando WM_KEYUP
y WM_CHAR
, porque si hago clic en alguna parte en el medio de componer un personaje de Corea, no lo entiendo una composición mensaje, pero tengo que agregar ese personaje a mi cuadro de texto, no obstante. Este es un comportamiento extraño, me pregunto si es un error.
Una vez que eso sucede, existen diferentes comportamientos entre coreano, chino y japonés.
El coreano es realmente fácil (aunque no estoy seguro acerca de la conversión a Hanja, porque de todos modos no sé cómo usarla).
Básicamente, para todos los idiomas, cada vez que tengo un WM_IME_COMPOSITION
, tengo que llamar a ImmGetCompositionString
en Imm32.dll como he descrito en respuesta a this question. Luego lo visualizo como una composición en progreso, pero no lo agrego a mi texto almacenado.
Cuando se ha compuesto una cadena, el mensaje de Windows es diferente para cada IME. Cada vez, puedo obtenerlo del mensaje WM_IME_COMPOSITION
.
En Corea, LParam
será simplemente GCS_RESULTSTR
y WParam
será el carácter introducido, que acabo pueden transmitir contenido a char
En 'LParam' japonesa será GCS_RESULTREADSTR | GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE
. Tengo que usar el resultado de ImmGetCompositionString
que almacené del mensaje anterior WM_IME_COMPOSITION, porque en este momento será una cadena vacía.
En chino, LParam
habrá GCS_RESULTREADCLAUSE | GCS_RESULTSTR0 | GCS_RESULTCLAUSE
. Es lo mismo que en japonés, excepto cuando el ImmGetCompositionString
previamente almacenado está vacío, en cuyo caso necesito convertir WParam
en un carácter.
En los tres casos, tengo que asegurarse de que mi comp visualizado en curso se borra.
Si recibo WM_IME_STARTCOMPOSITION
, que establece un indicador de composición (y mostrar la cadena de composición en curso)
Si recibo WM_IME_ENDCOMPOSITION
puedo borrar esa bandera (y aclaro la cadena de composición en curso).
A veces no recibo WM_IME_ENDCOMPOSITION
, por lo que borro mi bandera al recibir WM_CHAR
.
Con todo, fue una experiencia de aprendizaje muy interesante, y uno que aún está en curso - pero IME ahora se puede usar en mi control, al fin! Me quedé en el trabajo hasta la 1am para hacerlo.
Acabo de encontrar http://stackoverflow.com/questions/434048/how-do-you-use-ime, habría sido bueno haber visto eso antes! –