中止 Windows IME 组合/清除组合字符串

aborting Windows IME composition / clearing composition string

我在 Windows 上中止 IME 合成时遇到问题。

我正在处理 WM_IME_STARTCOMPOSITION 并定位我的候选人 window 和 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() 可以完成这项工作,但我一定遗漏了一些东西。

你可以这样清除构图:

ImmSetCompositionStringW(himc, SCS_SETSTR, L"", sizeof(wchar_t), L"", sizeof(wchar_t));

此外,在我的应用程序中,当输入失去焦点时,我释放输入上下文:

ImmReleaseContext(hwnd, himc);

并在获得焦点时再次获取它:

ImmGetContext(hwnd);