ITfTextInputProcessor :: Deactivate неожиданно вызывается при восстановлении фокуса - PullRequest
1 голос
/ 11 февраля 2012

Я использую текстовый сервис для Windows. Вещи работают нормально. Однако, когда я перемещаю фокус окна в другое приложение и возвращаю фокус в исходное приложение, выбранные текстовые сервисы деактивируются (я замечаю вызов ITfTextInputProcessor::Deactivate). Я считаю этот звонок неожиданным. Отправьте этот вызов, сервис должен быть повторно активирован вручную. Я конечно делаю что-то глупое. Просто я не знаю, что это такое.

1 Ответ

1 голос
/ 16 февраля 2012

Не так, я бы сказал, что вы действительно делаете что-то глупое. :) В частности, я бы уделил пристальное внимание вашей ITfThreadMgrEventSink :: OnSetFocus реализации (и, очевидно, вам необходимо реализовать ITfThreadMgrEventSink в вашей текстовой службе и подключите его через AdviseSink , если вы этого еще не сделали.)

После дополнительных исследований я выяснил, что происходит:

Когда вы возвращаете фокус в Word, TSF получает текущую раскладку клавиатуры текущего потока (фактически идентификатор локали). Затем он сравнивает эту раскладку клавиатуры с идентификатором языка текущей активной текстовой службы.

Если они различаются, то ФБО затем активирует текстовую службу для активной раскладки клавиатуры и деактивирует любую ранее активную текстовую службу.

Я считаю, что такое поведение отличается в Vista / Windows 7.

Исправление будет заключаться в использовании LoadKeyboardLayout / ActivateKeyboardLayout для установки раскладки клавиатуры процесса в вашей реализации ITfTextInputProcessor :: Activate. Очевидно, что некоторым приложениям также нужно, чтобы вы также вызывали ITfInputProcessorProfiles :: ChangeCurrentLanguage ().

...