пятница, 13 августа 2010 г.

Windows - альтернативное сочетание клавиш для переключения раскладки клавиатуры

Довольно долго меня раздражало то, что в виндах возможно переключение раскладки только по ctrl+shift или alt+shift. Но целиком я это неудобство прочувствовала позже, после установки виртуалки с виндами в Линухе... в итоге было принято решение - винды должны подстраиваться под Линь, а не наоборот!))



Поясню для тех, кто не знает. Если в Линуксе поставить переключение раскладки по ctrl+shift - то перестают работать в прикладных программах всякие там "контрол+шифт+чтото". Сочетание alt+shift для меня просто неудобно. Поэтому давно, еще со времен когда у меня стояла Убунту, было выбрано shift+caps lock. И в последующих дистрах ставила только его =)
Но однажды пришлось много работать и в любимой Gentoo, и в WinXP, которая находилась на виртуалке. И причем в обоих системах приходилось набирать текст в разных раскладках. То, что язык ввода переключался разными сочетниями клавиш, добивало...
Самым простым способом было поменять сочетание в Лини, но по указанной выше причине этот способ не подходил. Тогда я принялась глумиться над виндами, как над системой, не заслуживающей снисхождения =)

Возможные варианты использования всякой хрени типа Пунтосвитчера были отвергнуты сразу - потому что меня в первую очередь интересовало осуществление задуманного стандартными средствами. Прогуглив весь вечер, натолкнулась на пару интересных статей, описывающих возможность переназначения функций клавиш и переключения раскладки по Caps Lock (статья намбе раз и статья намбе два). Идея пришла довольно-таки резонная - Caps Lock как таковой ми практически и не использует, поэтому ему можно назначить функцию левого Control. Система будет воспринимать Капс как Контрол и переключение раскладки будет таким, какое удобно мне. А включение режима ввода заглавных букв можно повесить... ну например на правый winkey, которым ми пользуется еще реже, чем капслоком.

Пока ми еще обдумывала, как именно что сделать, руки сами ткнули привычное winkey+r - regedit - enter и полезли в ключ [HKLM\System\CurrentControlSet\Control\Keyboard Layout] (не путать с [HKLM\System\CurrentControlSet\Control\Keyboard Layouts]!). В данном ключе создается двоичный параметр Scancode Map, в котором прописывается какая клавиша будет восприниматься системой по-другому) У мну он выглядит следующим образом (выделю цветом, чтоб было удобнее объяснять):
00 00 00 00 00 00 00 00 03 00 00 00 1D 00 3A 00 3A 00 5C E0 00 00 00 00
Первыми должны идти 8 нулей, они выделены красным. Затем мы должны определиться, сколько клавиш будет переназначено. В данном случае меняем Caps Lock на Control, а правый WinKey на Caps Lock, итого - 2. прибавляем единицу и получаем что необходимо далее написать 03 (синяя секция). Дальше идут собственно сами переназначения клавиш по их скан-кодам. (Скан-коды можно посмотреть хотя бы тут, нас интересует колонка Make). Принцип следующий - первым идет код клавиши, функция которой будет назначена, второй - клавиша, которой эту функцию назначаем. В нашем примере в первом случае (зеленый) капс локу назначается функция контрола, во втором (пурпурный) - функция капс лока правому вин. И под конец идут еще 4 нуля, выделены голубым.
Чтобы сделать так, чтобы клавиша системой не воспринималась вообще, достаточно написать 00 00 и код клавиши.

С покупкой ноута, где на клаве отсутствует правый winkey, функции капслока перенесла на scroll lock. Для этого параметр Scancode Map должен выглядеть так:
00 00 00 00 00 00 00 00 03 00 00 00 1D 00 3A 00 3A 00 46 00 00 00 00 00

На практике это все работает. Но дальше меня заинтересовала теория. Ведь если посмотреть, то для системы переключение раскладки осталось по ctrl+shift, просто она воспринимает caps как control, и функция капс лока теперь на другой клавише. Что же касается реализации всего этого таким образом, чтобы система понимала сочетание caps lock+shift и при этом функция caps была на месте - такого способа ми не смогла найти. Переключала настройки с ctrl+shift на alt+shift под чутким надзором Process Monitor, но выяснить удалось не так много: в ключе [HKEY_CURRENT_USER\Keyboard Layout\Toggle] находятся параметры, которые определяют сочетание клавиш для переключения раскладки и языка ввода. Но заданы они в виде 1 или 2 (1=alt+shift, 2=ctrl+shift). А вот где именно расположено определение сочетаний как 1 или 2 - хз. Мб в самом ctfmon, кто его знает...

Конечно, существует специальный софт, который не требует таких заморочек и делает все вместо пользователя... но не знаю как для вас, а ми интереснее разобраться как это все работает и самой сделать все самой. =)