2016-12-29 127 views
0

我在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

您可以清除组成本:

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

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

ImmReleaseContext(hwnd, himc); 

又一次把它当焦点上涨:

ImmGetContext(hwnd);