我正在Windows上实现文本服务。事情很好。但是,当我将窗口焦点转移到另一个应用程序并将焦点转移回原始应用程序时,所选的文本服务将被取消激活(我注意到对ITfTextInputProcessor::Deactivate
的调用)。我认为这个电话是出乎意料的。发布此呼叫后,必须手动重新激活该服务。我肯定会做一些傻瓜。只是我不知道它是什么。
答案 0 :(得分:1)
副手,我会说你确实做了一些傻瓜。 :)特别是,我会特别注意您的ITfThreadMgrEventSink::OnSetFocus实施(显然,您需要在文本服务中实施 ITfThreadMgrEventSink并通过{{连接它3}}如果你还没有。)
经过更多的研究,我发现了正在发生的事情:
当您将焦点设置回Word时,TSF会获取当前线程的活动键盘布局(实际上是区域设置ID)。 然后,它将该键盘布局与当前活动文本服务的语言ID进行比较。
如果它们不同,TSF会激活活动键盘布局的文本服务,并停用任何以前活动的文本服务。
我相信这种行为在Vista / Windows 7上有所不同。
修复方法是使用AdviseSink / LoadKeyboardLayout在ITfTextInputProcessor :: Activate实现中设置进程键盘布局。显然,有些应用还需要您拨打ActivateKeyboardLayout()。