我在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()的调用会起作用,但我必须遗漏一些东西。
答案 0 :(得分:1)
您可以用以下方法清除构图:
ImmSetCompositionStringW(himc, SCS_SETSTR, L"", sizeof(wchar_t), L"", sizeof(wchar_t));
此外,在我的应用程序中,当输入失去焦点时,我释放输入上下文:
ImmReleaseContext(hwnd, himc);
在获得焦点时再次获得它:
ImmGetContext(hwnd);