Изменить раскладку клавиатуры для другого процесса

Я пишу программу на C #, которая работает в фоновом режиме и позволяет пользователям использовать горячую клавишу для переключения раскладки клавиатуры в активном окне. (Windows поддерживает только CTRL + SHIFT и ALT + SHIFT)

Я использую RegisterHotKey, чтобы поймать горячую клавишу, и она работает нормально.

Проблема в том, что я не могу найти API для изменения раскладки клавиатуры для окна с фокусом.

ActivateKeyboardLayout и LoadKeyboardLayout могут изменять только раскладку клавиатуры для вызывающего потока.

Кто-нибудь знает, как изменить раскладку клавиатуры для другого потока (как это делает языковая панель)?


person SLaks    schedule 04.11.2008    source источник
comment
Когда вы переключаете языки с помощью встроенной в Windows горячей клавиши, это не влияет на разные потоки, не так ли?   -  person JXG    schedule 05.11.2008
comment
переключение раскладки клавиатуры по потоку? В отличие от общесистемного переключения раскладки? Что-то делаете с аккордами?   -  person jcolebrand    schedule 01.11.2010
comment
@drachenstern: не существует такой вещи, как общесистемное переключение раскладки клавиатуры; активная раскладка клавиатуры - это состояние для каждого потока пользовательского интерфейса. Я пытаюсь заменить Alt + Shift, чтобы случайно не нажать, поэтому аккорды не подходят (если я понимаю, что вы имели в виду).   -  person SLaks    schedule 01.11.2010
comment
Я полагаю, вы знали, что я имел в виду на аккорде. Я просто подумал, что раскладка клавиатуры унаследована от системы, и мне было любопытно, почему вы захотите переопределить ее для каждого потока. Почему бы вам не использовать тот же макет в потоке, что и в системе? Вот что мне было любопытно. Полагаю, я просто хочу узнать больше о том, как увидеть мир.   -  person jcolebrand    schedule 01.11.2010


Ответы (3)


Другой способ, который может быть приемлемым, если вы пишете что-то только для себя: определите отдельную комбинацию клавиш для каждого макета (например, Alt + Shift + 1 и т. Д.) И используйте SendInput, чтобы переключаться между ними.

Обстоятельства, при которых это можно использовать, конечно, ограничены.

person Roman Starkov    schedule 09.02.2009

Я думаю, уловка состоит в том, чтобы заставить ваш код выполняться в контексте потока, раскладку клавиатуры которого вы хотите изменить. Здесь вам нужно будет выполнить взаимодействие с win32 и узнать о внедрении DLL, чтобы ваш код выполнялся в удаленном потоке.

обработчик перехвата клавиатуры выглядит хорошим вариантом для вас здесь.

Взгляните на http://www.codeproject.com/KB/threads/winspy.aspx

person Sijin    schedule 05.11.2008

person    schedule
comment
Это отлично работает с GetForegroundWindow для handle. Единственным исключением являются программы WPF, которые, кажется, блокируются в ответ на это сообщение. - person Roman Starkov; 01.11.2015
comment
@RomanStarkov Как узнать, какая версия WPF затронута и в чем причина? - person Dims; 12.04.2019
comment
@Dims Я не знаю ни того, ни другого. Интересно, связана ли причина с этим (но это не поможет вам решить проблему) - person Roman Starkov; 12.04.2019