我正在windows上实现一个文本服务。事情进展顺利。然而,当我将窗口焦点转移到另一个应用程序并将焦点转移回原始应用程序时,所选的文本服务将被取消激活(我注意到对ITfTextInputProcessor::Deactivate
的调用)。我觉得这个电话出乎意料。拨打此电话后,必须手动重新激活该服务。我肯定在做傻事。只是我不知道它是什么。
顺便说一句,我想说你确实在做一些愚蠢的事情。:)特别是,我会仔细注意您的ITfThreadMgrEventSink::OnSetFocus实现(显然,您需要在文本服务中实现ITfThreadManagerEventSink,如果您还没有实现,请通过AdviseLink连接它。)
经过更多的研究,我发现了正在发生的事情:
当您将焦点设置回Word时,TSF会获取当前线程的活动键盘布局(实际上是一个区域设置ID)。然后,它将该键盘布局与当前活动文本服务的语言ID进行比较。
如果它们不同,TSF将激活活动键盘布局的文本服务,并停用任何以前活动的文本服务。
我相信这种行为在Vista/Windows7上是不同的。
修复方法是使用LoadKeyboardLayout/ActivateKeyboard布局在ITfTextInputProcessor::Activate实现中设置进程键盘布局。显然,有些应用程序还需要调用ITfInputProcessorProfiles::ChangeCurrentLanguage()。