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

时间:2016-12-29 15:42:39

标签: windows ime

我在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()的调用会起作用,但我必须遗漏一些东西。

1 个答案:

答案 0 :(得分:1)

您可以用以下方法清除构图:

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

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

ImmReleaseContext(hwnd, himc);

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

ImmGetContext(hwnd);