2016-12-29 31 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

あなたはこれで構図をクリアすることがあります。

ImmReleaseContext(hwnd, himc); 

とフォーカスが得たとき、再びそれを得る:

入力がフォーカスを失ったとき、私は入力コンテキストを解放し、自分のアプリケーションでは、他に

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

ImmGetContext(hwnd); 
関連する問題