2012-02-11 1 views
1

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

ответ

1

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

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

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

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

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

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

+0

Ну, это нормально, если я переключаюсь между двумя документами MS Word. Я получаю все ожидаемые вызовы и не получаю 'DeActivate'. С другой стороны, MS Excel и Powerpoint ведут себя как not tsf aware (бит 'TF_SS_TRANSITORY' установлен). Когда я переключу фокус на эти приложения и переключу фокус на исходный, я не получаю вызовы OnSetFocus', просто 'DeActivate'. Кстати, это Windows XP и Office 2007. –

Смежные вопросы