2016-12-29 45 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);