Клуб Punto Switcher

Как приспособить Punto Ыцшесрук к другой раскладке.

30 октября 2008, 20:31

В Windows есть файлы в папке System32, отвечающие за раскладку клавиатуры. Если их изменить (или написать другие, на которые сделать ссылку из реестра, что будет более коорректно), то Punto этого не замечает, а пользуется копией раскладки, лежащей внутри своего кода в файле punto.exe, ранее ps.exe. С 3-й версии (видимо) кодировка символов в его раскладке стала 2-байтовой, но, всё же, её найти легко, чтобы исправить недостаток неправильного переключения. К слову, в известной программе-конкуренте такой копии раскладки не было, она пользовалась напрямую dll-файлами раскладок из системы, и если там файл меняли, вопросов о донастройке переключения раскладок не возникало. Здесь же пока приходится это делать вручную. Зачем пригодится замена раскладок? Для себя я приспособил раскладку русской и английской клавиатур к меньшему количеству "перескоков" символов между клавишами. Другими словами, в английской раскладке установил служебные символы, максимально совпадающие с русским стандартом, а остальные разместил по удобству доступа. В результате, для большинства служебных символов (все по верхнему ряду и точка, запятая) не нужно вспоминать, в какой раскладке находится клавиатура. Вполне возможно, что такую технику замены раскладок можно приспособить и для другого языка, оставляя для PS впечатление того, что он работает с "русским". В частности, эта задача актуальна при создании фонетической раскладки - http://ourworld.compuserve.com/homepages/PaulGor/kbd_r.htm. Пример приспособления PS к заменённой раскладке. Перед работой по модификации двух раскладок (EN-US и RU) предполагается, что в системе они установлены и объявлены стандартными средствами (Control Panel -> Regional and Language Options -> Languages -> Details -> Settings). Cтандартная раскладка русского и английского языков имеет вид:   ё1234567890-=\ йцукенгшщзхъ фывапролджэ ячсмитьбю. Ё!"№;%:?*()_+/ ЙЦУКЕНГШЩЗХЪ ФЫВАПРОЛДЖЭ ЯЧСМИТЬБЮ,   `1234567890-=\ qwertyuiop[] asdfghjkl;' zxcvbnm,./ ~!@#$%^&*()_+| QWERTYUIOP{} ASDFGHJKL:" ZXCVBNM<>?

В версии программы 2.9.5.0 в файле ps.exe этот участок кодов легко найти поиском в 16-ричном редакторе (адрес 8D28h). Он обрамлён в коде 2 символами 00h. В версии 3.0.0.67 система чуть сложнее, но всё равно, пользуясь догадками о кодировках UTF-8, возможно найти аналогичный участок из 2-байтовых символов с адреса 62398h, оБрамлённый 4 символами 00h. (В нём однобайтовые коды символов дополняются символами 00h.) Кодировка английской раскладки (и немного - русской, знак номера (1621h) на знак "#" (2300h) (и "\" на "/", потому что чаще используется), была заменена на:  

ё1234567890-=/ йцукенгшщзхъ фывапролджэ ячсмитьбю. Ё!"#;%:?*()_+\ ЙЦУКЕНГШЩЗХЪ ФЫВАПРОЛДЖЭ ЯЧСМИТЬБЮ,   `1234567890-=/ qwertyuiop[] asdfghjkl$' zxcvbnm<>. ~!"#;%:?*()_+\ QWERTYUIOP{} ASDFGHJKL^@ ZXCVBNM|&,

Следовательно, в PS этот участок кода надо скорректировать соответствующе, чтобы автопереключение работало корректно. Поскольку большинство символов не 2-байтовые, заменяем их внимательно и посимвольно в 16-ричном редакторе, оставляя между символами знаки 00h, не меняя длины файла, не забыв сохранить исходный файл на случай возврата к оригинальной версии программы. Запускать этот файл на месте исходного, разумеется, стоит тогда, когда раскладки в системе заменены на другие, иначе автопереключение будет работать некорректно. Конечно, с выходом новой версии файл punto.exe придётся переделывать каждый раз, а для правки новой инсталляции той же версии PS, не потерять уже однажды сделанный скорректированный файл программы. (Продолжение о том, как заменять раскладки, следует.)

5 комментариев
Подписаться на комментарии к посту
Скажите пожалуйста, а Ыцшесрук вместо Switcher получилось после вышеприведенных развлечений с кодом?
Нет, это до того (когда менял код, программу приходилось отключать). :)

Продолжение. Как заменять раскладки в системе Windows? Кроме пользования набором стандартных языковых раскладок, возможно сделать собственные файлы раскладок и корректно, безболезненно заменить системные на собственные. Меняться раскладки, правда, будут не "на лету", а после перезапуска Windows. Отрицательные последствия возможны в тех случаях, когда некоторые "наивные" программы считают, что раскладки в системе стандартные. Ну, или когда пользователь, не знакомый с новой раскладкой, начнёт возмущаться неудобству работы, особенно, если этот компьютер - его собственный. Поэтому следует устанавливать раскладки осмотрительно, в расчёте на собственную работу с компьютером, не забывать о процедуре возврата к исходным настройкам при необходимости. Самый простой способ - подмена системных файлов, лежащих в папке \WINDOWS\system32\ и их дублей в \WINDOWS\system32\dllcache\ . Это делать не совсем корректно, и чтобы фокус прошёл, надо отключить защиту системных папок в Windows. Поэтому такой способ не рекомендуется, а лучше объявлять в реестре использование файлов раскладок с другим именем, лежащих в \WINDOWS\system32\ (за ними не будет слежения и защиты). Имена файлов типично используемых раскладок - "Русский" ("Russian - Russian") и "Английский (США)" ("English (United States) - US") - KBDRU.DLL и KBDUS.DLL . Их, конечно, тоже можно модифицировать методом хака, но структура их сложнее, поэтому лучше воспользоваться сделанными для этого инструментами. Какие программы редактируют файлы раскладок? Если поискать по теме, то найдётся одна исчезающая программа, сделанная ещё для Windows NT. Её имя - KBDEDTNT.EXE под общим названием "Keyboard Layout Editor (KLE) для Win NT 3.51", она выдаёт отредактированные файлы с расширением *.NKL . Их содержание совершенно одинаково с файлами KBDXXX.DLL для WindowsXP/2000, поэтому достаточно всего лишь переименовать расширения и придумать уникальное имя. Затем, эти файлы нужно объявить в реестре, в 3 ветках с именами \ControlSet001, \ControlSet002, \CurrentControlSet .  

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts\00000409]  
"Layout File"="KBDUSs.DLL"  
"Layout Text"="US"  
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts\00000419]  
"Layout Text"="Russian"  
"Layout File"="KBDRUs.DLL"  
... и т.д. 

Кодовым страницам 409 и 419 приписываются новые файлы, лежащие в \WINDOWS\system32\ . Эту программу уже не найти на адресах в сети, и если не найдётся более новой замены, она лежит в общем архиве с готовыми файлами KBDUSs.DLL, KBDRUs.DLL и файлом реестра instLayoutKbd.reg . Конечно, нужно иметь возможность отката назад, поэтому пишем другой файл реестра, для деинсталляции раскладки (UNinstLayoutKbd.reg) :

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts\00000409]  
"Layout File"="KBDUS.DLL"  
"Layout Text"="US"  
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts\00000419]  
"Layout Text"="Russian"  
"Layout File"="KBDRU.DLL"  
... и т.д. 

 Он тоже помещён в общий архив, как и исходные файлы системы: KBDUS.DLL, KBDRU.DLL . Имя архива программы Punto Switcher v. 3.0.0.67 с изменённой раскладкой - Punto-Switcher-Layout-30067.rar, 1.07 Мб. Имя архива с этой инструкцией, файлами и программой KBDEDTNT.EXE - Punto-Instuctions-Kbd-Layout-30067.rar, 439 Кб.

После версии 30067, где этот хак был нужен, вышла версия 3.1, в которой необходимости в хаке почти не осталось. То есть, если заменяем раскладку, переключение её происходит по файлам  из Windows , а не из таблицы в программе, как раньше. Спасибо за сделанную доработку. Это, кстати, шаг к установке произвольной 2-языковости.

 

Теперь, что значит "почти"?

Сменил раскладку, после чего, например знаки // перестали переключаться (они в новой раскладке на одной клавише, а в традиционной они переключаются на ".."). Но, о чудо, зависимость от языка ещё существует: если набираю // на правой клавиатуре, переключение по Break происходит, как со старой раскладкой, на точки. А переключение по выделению+Break выполняется правильно. (Или это у меня не совсем правильный файл раскладки? Но ведь второй вариант переключения работает правильно?)

Vozmozhni li priuchit' punto dlya raboty s Bel'gijskoj raskladkoj ?
Spasibo