【发布时间】:2017-05-13 23:10:04
【问题描述】:
在 Windows 上中止 IME 合成时遇到问题。
我正在处理 WM_IME_STARTCOMPOSITION 并定位我的候选窗口,以及 WM_IME_COMPOSITION,因为我按下一个键开始按您所期望的方式编写。然后我在最后处理 WM_IME_ENDCOMPOSITION,正常用例就可以了。
但是,我的问题是当我在应用程序内部更改焦点时。我没有收到 WM_IME_ENDCOMPOSITION 所以我必须手动处理这种情况。我正在做的是这样的:
ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0 );
ImmNotifyIME( himc, NI_CLOSECANDIDATE, 0, 0 );
候选列表正确消失,但合成字符串未清除。如果我然后用 GCS_COMPSTR 调用 ImmGetCompositionString,它仍然存在。因此,如果我将焦点返回,接收 WM_IME_STARTCOMPOSITION 和第一个 WM_IME_COMPOSITION - 我最终会继承以前的合成字符串,这是我不想要的。我想重新开始。
ImmSetCompositionString() 看起来也可以,但我不知道如何让它清除字符串。
有人有什么建议吗? MSDN 似乎暗示对 ImmNotifyIME() 的调用可以完成这项工作,但我一定遗漏了一些东西。
【问题讨论】: