1

我正在 Windows 上实现文本服务。一切正常。但是,当我将窗口焦点转移到另一个应用程序并将焦点转移回原始应用程序时,选定的文本服务将被停用(我注意到调用ITfTextInputProcessor::Deactivate)。我认为这个电话是出乎意料的。发布此呼叫,必须手动重新激活该服务。我肯定在做一些愚蠢的事情。只是我不知道它是什么。

4

1 回答 1

1

顺便说一句,我会说你确实在做一些愚蠢的事情。:) 特别是,我会特别注意您的ITfThreadMgrEventSink::OnSetFocus实现(显然,您需要在文本服务中实现 ITfThreadMgrEventSink并通过AdviseSink连接它,如果您还没有。)

经过更多的研究,我已经弄清楚发生了什么:

当您将焦点设置回 Word 时,TSF 获取当前线程的活动键盘布局(实际上是一个区域设置 ID)。然后,它将该键盘布局与当前活动文本服务的语言 ID 进行比较。

如果它们不同,则 TSF 然后为活动键盘布局激活文本服务,并停用任何以前活动的文本服务。

我相信这种行为在 Vista/Windows 7 上是不同的。

解决方法是使用LoadKeyboardLayout / ActivateKeyboardLayout在您的 ITfTextInputProcessor::Activate 实现中设置进程键盘布局。显然有些应用程序也需要你调用ITfInputProcessorProfiles::ChangeCurrentLanguage () 。

于 2012-02-16T18:43:26.457 回答