Переопределение клавиш
Задача
Иногда возникает желание переместить или отключить какие-то кнопки клавиатуры. Мысль, сделать это физически, не всегда плодотворна, хотя я встречал советы, выломать Caps Lock или Ins. Функциональность компьютерной клавиатуры в определенных пределах можно подогнать и софтверным путем. Начиная с Windows 2000 (включая XP, Vista и 7), существует возможность переопределения или отключения клавиш, для чего необходимо внести специальную запись в системный реестр Windows.
Плюс данного способа заключается в том, что изменения действуют для всех приложений, для самой Windows, в том числе в окне командной строки («консоль»). По понятным причинам функциональность клавиш при работе с BIOS не может быть изменена таким образом. Для сравнения, другие механизмы имеют более ограниченный «радиус действия»: макросы работают лишь внутри отдельно взятых прикладных программ; утилита ЮNIK преследует другую цель, а именно присвоение символьным клавишам произвольных символьных значений, со служебными клавишами она не работает.
В принципе, возможно присвоение разных схем переопределения отдельным пользователям одного и того же компьютера, однако реализация этого отличается непоследовательностью, подробнее об этом можно почитать, например, здесь: http://justkeepswimming.net/keymapper/blog/?c=1.
В этой связи оговоримся, что если «ядро» механизма (стандартные клавиши, настройка всего компьютера целиком) работает единообразно, то дополнительные функции требуют учета особенностей конкретной версии Windows и/или компьютера. Так описанная ниже перенастройка «валютных» клавиш ноутбуков фирмы Acer работает, судя по всему, не всегда.
Чаще всего необходимость в переопределении клавиш может возникать у пользователей ноутбуков. Особенность ноутбучных клавиатур заключается в том, что служебные клавиши часто располагаются по-разному. По этой причине могут возникать проблемы, например:
(1) При переходе с одного ноутбука на другой приходится переучиваться.
(2) Необходимо попеременно работать с несколькими компьютерами с разным расположением отдельных клавиш, например, на стандартной клавиатуре десктопа и нестандартной ноутбука.
(3) От приобретения неплохого ноутбука приходится отказаться по причине неудачного расположения всего лишь нескольких, но важных клавиш.
Как это делается
Необходимые изменения в реестр можно вносить разными способами. В частности, в Интернете находится (расположено & можно найти) некоторое количество программ, которые могут сделать это автоматически. Мы рассмотрим здесь правку реестра вручную, справиться с чем может, в принципе, почти любой мало-мальски знакомый с компьютером пользователь. Для этого запускаем программу regedit (Пуск/Start – Выполнить/Execute – regedit). В реестре ищем позицию:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
Создаем здесь новую двоичную запись («двоичный параметр») под названием Scancode Map.

Данная запись может быть отредактирована средствами regedit.

Она имеет строго предписанную структуру, описание которой может быть найдено в следующем документе компании Microsoft: http://www.microsoft.com/whdc/archive/w2kscan-map.mspx
Cтруктуру данной строки можно пояснить на примере ниже, все числа – в шестнадцатеричной форме (hexadecimal):
| 00 00 00 00 | 00 00 00 00 | 04 00 00 00 | 53 E0 52 E0 | 52 E0 53 E0 | 00 00 3A 00 | 00 00 00 00 |
| всегда нули | число записей | первая замена | вторая замена | третья замена | всегда нули |
| | Меняем местами Ins и Del | Отключаем Caps Lock | |
Группировки по две шестнадцатеричные цифры – 00, E0, 3A и т.д. – означают отдельные байты, знание чего пригодится нам чуть ниже. Промежутки введены исключительно для удобства восприятия человеком, ту же самую строчку можно записать следующим образом:
00000000000000000400000053E052E052E053E000003A0000000000
Поле число записей содержит число полей по 4 байта (= 8 шестнадцатиричных цифр; = 32 бита), расположенных после этого этого поля, и равно числу замен + 1. Если строка Scancode Map создана, но ни одна клавиша не переназначена, то это поле должно содержать значение 1.
В более развернутом виде, число записей образуется путем суммирования следующих позиций: (1: факультативно) число пар клавиш, обменивающихся своими функциями, * 2 + (2: факультативно) число клавиш, получающих новые функции, но не отдающих свои + (3: факультативно) число отключаемых клавиш + (4: всегда) один (последняя цепочка нулей). Например, если мы меняем местами Del и Ins, что требует две записи, а Caps Lock отключаем совсем, для чего нужна одна запись, то здесь нужно поставить число 04000000 (1*2 + 0 + 1 + 1).
Ключевую роль играют поля замена, содержащие т.н. скан-коды клавиш, которые генерируются клавиатурой. Скан-коды, как правило, состоят из одного или двух байт, хотя известны и более длинные комбинации. В реестре всегда должны быть указаны два байта (= 4 цифры), поэтому, если скан-код состоит из одного байта (= две цифры), то две недостающие цифры просто заменяются нулями. Сразу нужно указать на то, что порядок записи байтов в реестр обратный (т.н. little endian). Проиллюстрировать это лучше всего на примерах:
- скан-код клавиши Enter – 1C; для получения двухбайтовой комбинации это число нужно предварить двумя нулями, итого получаем – 00 1С; при вставке в реестр нужно поменять порядок байт на противоположный – 1С 00
- скан-код клавиши PgUp изначально содержит два байта – E0 49; следовательно, нам нужно лишь поменять их местами при записи в реестр – 49 E0
Каждое из полей первая и вторая замена содержат скан-коды двух клавиш. Вначале идут четыре цифры, означающие скан-код той клавиши, функцию которой данная физическая клавиша должна начать выполнять после переопределения. Последние четыре цифры означают первоначальный скан-код самой физической клавиши, что соответствует символу, который на нее нанесен. Еще раз обратим внимание: порядок пар цифр (= байтов), вводимых в реестр, должен быть обратным по сравнению со скан-кодом. Структура отдельной замены выглядит следующим образом:
| 0E 00 38 E0 |
| 0E 00 | 38 E0 |
| Новая функция переназначаемой клавиши – «Backspace» (скан-код: 0E или 00 0E) | Изначальная функция переназначаемой клавиши – «Правый Alt» (скан-код: E0 38) |
Каждая замена присваивает новую функцию лишь одной клавише, по причине чего, для обмена функциями между двумя клавишами необходимы две замены. В таком случае вторая замена содержит те же коды, но записанные наоборот. В принципе, можно присваивать новые функции не попарно, а произвольно. Главное, не запутаться потом самому.
В случае, если клавиша просто отключается (третья замена), то вместо скан-кода новой функции ставятся четыре нуля. Например, запись для отмены (запрета, деактивации) клавиши Caps Lock будет выглядеть следующим образом: 0000 3A00.
Скан-коды могут быть получены из различных источников в Интернете, например: http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc (колонка «scan 1 make»)
Можно воспользоваться и простой утилитой KeyCode: KeyCode.exe. Для вставки в реестр используется значение из поля Scan Code Hexadecimal. Сразу оговоримся, что эта утилита имеет ограниченные возможности по распознанию нестандартных ситуаций. Во-первых, она выдает коды уже после ремаппинга (переопределения). Во-вторых, информация о кодах получается из сообщений Windows API, по причине чего коды некоторых клавиш будут распознаны неверно.
Типичные примеры «сложных» клавиш – Pause и PrtScr. Вышеприведенный источник содержит дополнительную информацию по этому поводу. Скан-код клавиши PrtScr – E0 2A E0 37; клавиши Pause – E1 1D 45 E1 9D C5. Однако, как показывают эксперименты, для PrtScr можно ограничиться использованием первых двух байт, или точнее, последних (и здесь играет роль обратный порядок записи). Иными словами, четырехзначная комбинация, которая должна быть внесена в реестр, для этой клавиши будет выглядеть как 37 E0.
После изменения реестра компьютер необходимо перезагрузить. Если эксперименты оказались неудачными и путеводная звезда потеряна, то позицию Scancode Map можно просто-напросто стереть. Ниже приведены два примера из практики, когда переопределение клавиш оказалось полезным.
«The Application key can be located wherever it appropriately fits.»
Microsoft
В какой-то момент развития компьютеростроения стандартная клавиатура показалась скучноватой и компания Microsoft решила обогатить ее двумя (или тремя, как считать) новыми клавишами. Одной из них стала клавиша Application, назначение которой заключалось в вызове контекстного (= плавающего) меню. Однако, так как пользователи привыкли вызывать это меню правой кнопкой мыши, популярность новой клавиши оказалась скромной. Отказаться от нее совсем было нельзя, иначе такая клавиатура не прошла бы тест на Windows-совместимость и не смогла бы носить гордый предикат Designed for Windows YX, а вот отправить куда-нибудь на периферию, можно было вполне, тем более что на это было дано явное разрешение самим Майкрософтом. Для сравнения, подобная вольность в отношении другой новой кнопки (или кнопок) с логотипом Windows не приветствовалась, ее следовало располагать поблизости от вспомогательных, но важных клавиш Ctrl, Alt и Shift.
Большинство производителей не воспользовались великодушием поставщика ОСов и слепо влепили кнопку Application туда, где ее нарисовали программисты из Редмонда, т.е. между правыми Alt и Ctrl. Иным был подход компании Toshiba, которая отправила Application в крайний правый угол, а ценное место заняла кнопками |, Ins и Del. Насчет правильности решения в отношении первых двух не уверен, а вот расположение Del в районе между клавишей Space (Пробел) и блоком стрелочных клавиш мне понравилось. В итоге чего на своем новом ноутбуке, пришедшем на смену Тошибе, я присвоил кнопке Application функцию Delete. Заодно, клавиши Ins и Del оказались разнесенными, что тоже является положительным эффектом.
Скан-код клавиши Application – E0 5D; Del – E0 53. Следовательно, строчка для обмена функциями будет выглядеть следующим образом:
00000000 00000000 03000000 5DE053E0 53E05DE0 00000000
Зачем нам валюта?
При разработке своих ноутбуков фирма Acer проявила чудеса инновативности (или все же инновационности?) и ввела в блоке «стрелочных» клавиш две отдельные кнопки для валютных единиц: € и $. Лично мне оба этих знака нужны нечасто. А вот против того, чтобы рядом с четырьмя стрелочными клавишами находилась пара других для управления курсором, например, Home и End, я ничего не имею. Кстати, именно таково конструктивное решение в некоторых ноут- и нетбуках, например, LG X110. Интересно отметить, что хотя этот нетбук и производится на основе MSI Wind, но его клавиатура представляет собой специальную разработку: Это касается не только разумного расположения клавиш, но и прекрасных механических характеристик; на мой взгляд клавиатура LG X110/130 на текущий момент является одной из лучших в классе нетбуков.
Скан-код клавиши «евро» – E0 33; «доллар» – E0 34. Следовательно, строчка для присвоения обеим клавишам значений Home и End, соответственно, будет выглядеть следующим образом:
00000000 00000000 03000000 47E033E0 4FE034E0 00000000
Замечание: Для получения нужного эффекта при переназначении «валютных» клавиш в ноутбуках фирмы Acer, загружаемая по умолчанию утилита Launch Manager должна быть выгружена. Если по каким-то причинам вы не можете пойти на этот радикальный шаг, то в файле mmkeybd.cfg (расположенном в директории программы, скорее всего, C:\Program Files\Launch Manager) нужно закомментировать соответствующие строчки (номера клавиш в начале строк могут быть другими, ориентироваться при поиске следует на скан-коды и комментарии; клавиша Dollar Symbol может называться Money Symbol):
;Key 23 = 1,E0,33,E0,B3,F508,Euro Symbol
;Key 24 = 1,E0,34,E0,B4,F509,Dollar Symbol
Как мы видим, в этом файле находятся скан-коды специальных, дополнительных клавиш, таких как упомянутые евро и доллар, а также запуск браузера, почтовой программы и т.д. Эту информацию также можно использовать для изменения конфигурации компьютера.
В ноутбуках фирмы Toshiba Launch Manager называется Easy Button, а соответствующий конфигурационный файл находится в директории этой программы C:\Program Files\EzButton и может называться ezbutton.cfg или cpldbl10.cfg.
Коварная Fn-кциональность
В ноутбучных и малогабаритных клавиатурах используется клавиша Fn. Как правило, она находится справа от левого Ctrl. У ноутбуков Lenovo – наоборот. В некоторых ноутбуках, например, Lenovo X100e в BIOS'е есть настройка, позволяющая поменять левый Ctrl и Fn местами. Техническая реализация клавиши Fn отличается от других и привязана к «железу», а не к операционной системе, а это означает, что механизм переопределения с помощью записи в реестр Windows здесь не поможет. Поэтому, хотя эта клавиша и может генерировать скан-код – неодинаковый у разных моделей ноутбуков –, ее полноценное переопределение с помощью записи в реестр, как подтвердили эксперименты, невозможно. Даже если клавише Fn присвоить какое-то другое значение скан-кода, и она будет выполнять соответствующую ему новую функцию, свою прежнюю функциональность она при этом не потеряет. Аналогично, если присвоить скан-код клавиши Fn какой-то другой, это не приведет к тому, что эта другая клавиша начнет выполнять функции Fn. Вместе с тем, я допускаю, что в каких-то моделях ноутбуков (которые можно назвать «100 проц. Win-book») или клавиатур такое переназначение все-таки возможно, поэтому стоит, как минимум, попробовать. Скан-код клавиши Fn может быть определен с помощью представленной выше утилиты KeyCode. Последующее ничем не отличается от переназначения других клавиш.
* * *
Внимание: Манипуляции с системным реестром могут привести к сбоям в работе с компьютером! Автор данной страницы не несет ответственности за вызванные тем самым проблемы.
|