Не так, я бы сказал, что вы действительно делаете что-то глупое. :) В частности, я бы уделил пристальное внимание вашей ITfThreadMgrEventSink :: OnSetFocus реализации (и, очевидно, вам необходимо реализовать ITfThreadMgrEventSink в вашей текстовой службе и подключите его через AdviseSink , если вы этого еще не сделали.)
После дополнительных исследований я выяснил, что происходит:
Когда вы возвращаете фокус в Word, TSF получает текущую раскладку клавиатуры текущего потока (фактически идентификатор локали).
Затем он сравнивает эту раскладку клавиатуры с идентификатором языка текущей активной текстовой службы.
Если они различаются, то ФБО затем активирует текстовую службу для активной раскладки клавиатуры и деактивирует любую ранее активную текстовую службу.
Я считаю, что такое поведение отличается в Vista / Windows 7.
Исправление будет заключаться в использовании LoadKeyboardLayout / ActivateKeyboardLayout для установки раскладки клавиатуры процесса в вашей реализации ITfTextInputProcessor :: Activate. Очевидно, что некоторым приложениям также нужно, чтобы вы также вызывали ITfInputProcessorProfiles :: ChangeCurrentLanguage ().