Windows でテキスト サービスを実装しています。物事はうまくいきます。ただし、ウィンドウのフォーカスを別のアプリケーションに移動し、フォーカスを元のアプリケーションに戻すと、選択したテキスト サービスが非アクティブになります (への呼び出しに気付きますITfTextInputProcessor::Deactivate
)。この電話は想定外だと思います。この呼び出しを投稿すると、サービスを手動で再アクティブ化する必要があります。きっとおかしなことをしているに違いない。それが何なのかわからないというだけです。
1 に答える
手に負えない、私はあなたが確かに何か間抜けなことをしていると言うでしょう。:)特に、 ITfThreadMgrEventSink :: OnSetFocusの実装に細心の注意を払います(もちろん、テキストサービスにITfThreadMgrEventSinkを実装 し、まだ行っていない場合はAdviseSinkを介して接続する必要があります)。
さらに調査した後、私は何が起こっているのかを理解しました:
フォーカスをWordに戻すと、TSFは現在のスレッドのアクティブなキーボードレイアウト(実際にはロケールID)を取得します。次に、そのキーボードレイアウトを現在アクティブなテキストサービスの言語IDと比較します。
それらが異なる場合、TSFはアクティブなキーボードレイアウトのテキストサービスをアクティブにし、以前にアクティブだったテキストサービスを非アクティブにします。
この動作はVista/Windows7では異なると思います。
修正は、LoadKeyboardLayout / ActivateKeyboardLayoutを使用して、ITfTextInputProcessor::Activate実装でプロセスキーボードレイアウトを設定することです。どうやら一部のアプリでは、 ITfInputProcessorProfiles :: ChangeCurrentLanguage()も呼び出す必要があります。