2012-02-11 14 views
1

私はWindows上でテキストサービスを実装しています。物事は正常に動作します。しかし、ウィンドウのフォーカスを別のアプリケーションに移して、元のアプリケーションにフォーカスを戻すと、選択したテキストサービスが無効になります(私はITfTextInputProcessor::Deactivateへの呼び出しに気付きます)。私はこの呼び出しが予想外であると思う。このコールを投稿する。サービスは手動で再アクティブ化する必要があります。私は確かに何かうんざりしています。ちょうど私はそれが何であるか分からない。フォーカスを取り戻すとITfTextInputProcessor :: Deactivateが予期せず呼び出される

答えて

1

オフハンドでは、あなたは本当に何かうんざりしていると言います。 :)特に、私はあなたのITfThreadMgrEventSink::OnSetFocus実装に細心の注意を払うだろう(当然と、あなたはあなたのテキストサービスでITfThreadMgrEventSinkを実装まだお持ちでない場合AdviseSink経由で接続する必要があります。)

より後研究、私は何が起こっているのかを把握しました:

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

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

私は、この動作は、修正プログラムがあなたのITfTextInputProcessorのプロセスキーボードレイアウトを設定する::実装を有効にLoadKeyboardLayout/ActivateKeyboardLayoutを用いることであろうビスタ/ Windows上で7

異なっていると信じています。明らかに、一部のアプリでもITfInputProcessorProfiles::ChangeCurrentLanguage()に電話する必要があります。

+0

2つのMS Word文書を切り替えるとかなりうまく動作します。私はすべての期待される呼び出しを得て、 'DeActivate'を得ません。 一方、MS ExcelとPowerpointはnon tsf aware( 'TF_SS_TRANSITORY'ビットが設定されている)のように動作します。私がこれらのアプリにフォーカスを移し、フォーカスを元のものに戻すと、 'OnActivate'だけで' OnSetFocus'コールは得られません。 ところで、これはWindows XPとOffice 2007です。 –

関連する問題