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()への呼び出しがその仕事をするだろうと示唆しているようですが、何か不足しているはずです。