1

Windows でテキスト サービスを実装しています。物事はうまくいきます。ただし、ウィンドウのフォーカスを別のアプリケーションに移動し、フォーカスを元のアプリケーションに戻すと、選択したテキスト サービスが非アクティブになります (への呼び出しに気付きますITfTextInputProcessor::Deactivate)。この電話は想定外だと思います。この呼び出しを投稿すると、サービスを手動で再アクティブ化する必要があります。きっとおかしなことをしているに違いない。それが何なのかわからないというだけです。

4

1 に答える 1

1

手に負えない、私はあなたが確かに何か間抜けなことをしていると言うでしょう。:)特に、 ITfThreadMgrEventSink :: OnSetFocusの実装に細心の注意を払います(もちろん、テキストサービスにITfThreadMgrEventSinkを実装 し、まだ行っていない場合はAdviseSinkを介して接続する必要があります)。

さらに調査した後、私は何が起こっているのかを理解しました:

フォーカスをWordに戻すと、TSFは現在のスレッドのアクティブなキーボードレイアウト(実際にはロケールID)を取得します。次に、そのキーボードレイアウトを現在アクティブなテキストサービスの言語IDと比較します。

それらが異なる場合、TSFはアクティブなキーボードレイアウトのテキストサービスをアクティブにし、以前にアクティブだったテキストサービスを非アクティブにします。

この動作はVista/Windows7では異なると思います。

修正は、LoadKeyboardLayout / ActivateKeyboardLayoutを使用して、ITfTextInputProcessor::Activate実装でプロセスキーボードレイアウトを設定することです。どうやら一部のアプリでは、 ITfInputProcessorProfiles :: ChangeCurrentLanguage()も呼び出す必要があります。

于 2012-02-16T18:43:26.457 に答える