Скан-код: Ремаппинг клавиш на клавиатуре

    Предыстория


    Всю свою жизнь был фанатом бесшумных, тонких, и красивых клавиатур и к моему удивлению обнаружил что таковых не так уж и много, из доступных в свободной продаже, — их единицы. Пришлось пользоваться «Genius SlimStar Pro», и все равно она меня угнетала, как и мысль о том, что я никогда не найду клавиатуру которая бы удовлетворяла меня на все 100%. Я такую нашел и по рекомендации товарища Boomburum, приобрел "Illuminated Keyboard", которая стала достойной подругой моей "MX Revolution", и я окончательно порвал отношения с Genius, а последние рассказы о поддержке пользователей со стороны Logitech, убедили меня, что вложенные (не малые деньги) себя оправдают за 3 гарантийных года.
    image
    Но есть небольшая беда в клавиатурах этой компании, — "Не стандартные, не удобные, или не нужные расположения некоторых кнопок". В случае с Illuminated, это две одинаковые кнопки "\", левая из которых пошла в ущерб клавише «LShift», Кстати на картинке вы можете заметить что раньше эти клавиатуры имели стандартный размер «LShift». Под катом, я расскажу как вернуть «стандартную длину» этой кнопки, так как в слепой печати и в силу привычки, я нажимаю именно / вместо шифта. А заодно расскажу как без дополнительного установленного ПО, на примере, вы сможете менять назначения любых клавиш ваших клавиатур (в том числе и функциональных/медийных) при помощи Реестра и Скан-кода клавиш.

    Что такое Скан-код


    Спецификация для Windows.
    При нажатии любой клавиши контроллер клавиатуры вырабатывает скан-код, соответствующей позиции клавиши, который передаются в компьютер. Служебные коды, которые может вырабатывать контроллер клавиатуры, передаются для обработки подпрограммам BIOS. В буфере клавиатуры для кода клавиши отводится по 2 байта, т. е. он рассчитан на 16 символов.

    Как определить Скан-код клавиши


    Узнать Скан-код необходимой для ремаппинга клавиши вы можете здесь, а если у вас супер новая клавиатура с кнопками космического происхождения, то отловить скан-код вы можете используя программу "KeyboardTest" от разработчика Passmark Software. Программка платная, но бесплатным триалом. Или OpenSource Программу SharpKeys. Она потребовалась для определения скан-кода левой "\", так как многие наивно полагали что сигналы у обеих одинаковые, а значит и не подлежат ремаппингу. На деле оказалось не так.

    Правый "\" имеет скан-код: 2b.00
    Левый нижний "\" имеет скан-код: 56.00


    И так, мы определили скан-код нашей незадачливой кнопки, теперь нам нужно найти скан-код «LShift». Его можно найти по данной выше ссылке и он равен: 2A.00

    Ремаппинг клавиш


    Есть куча приложений которые делают этот ремаппинг, многие за базу принимают существующие скан-коды, многие не имеют сканера, что бы определить скан-код клавиши которой нет в базе. Да и устанавливать лишнее приложение очень не хотелось. По-гуглив я остановился на возможностях Windows. а точнее редактора реестра (Пуск-Выполнить: regedit). Или вышеупомянутую программу SharpKeys, которая имеет GUI и выполняет такую же замену в реестре

    1. В ветке
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
    создайте бинарный параметр с именем "Scancode Map"
    2. В параметр «Scancode Map» записываем следующие значения:
    00.00.00.00.00.00.00.00.02 — девятый байт (02) в этой записи означает количество клавиш которое мы будем менять (и равен количеству клавиш +1) в нашем случае это 02, так как мы меняем значения одной клавиши. После этого вписываем еще три «пустых» байта, и теперь наш параметр выглядит так:
    00.00.00.00.00.00.00.00.02.00.00.00.
    Поскольку мы уже определили все Скан-коды, то продолжая наш параметр, нам следует указать скан-код значения новой кнопки (в нашем случае это 2A.00), а затем скан-код старой (заменяемой) кнопки 56.00. Теперь необходимо закрыть эту функцию четырьмя «пустыми» байтами, то есть 00.00.00.00:
    image
    3. Перезагружаем компьютер и пользуемся нашими новыми кнопками.

    PS: Если нужно сделать ремаппинг не на всем ПК, а только в вашем сеансе, то значения необходимо менять в HKEY_CURRENT_USER\SYSTEM\CurrentControlSet\Control\Keyboard Layout

    UPD: Если вы боитесь работать в реесте, то создайте текстовый файл с расширением *.reg, и впишите туда следующее:
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
    "Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,2a,00,56,00,00,00,00,00

    затем сохраните, запустите, и перезагрузите ПК.

    UPD2: Перенос Скриншотов на
    1. Левый Win-key выглядит так:
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
    "Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,37,E0,5B,E0,00,00,00,00

    Правый Win-key выглядит так:
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
    "Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,37,E0,5C,E0,00,00,00,00
    Поделиться публикацией

    Комментарии 81

      0
      По просьбе Для ленивых, добавил в UPD2 перенос кнопки для снятия Скриншотов на кнопку Windows.
        +3
        Когда-то я писал программу Keyboard Maniac, она дает приятный интерфейс для настройки Keyboard Layout ключа (раздел «Раскладка клавиатуры»). За одно и скан коды можно узнать. Способ воистину для ленивых.
        Если интересно поищите версию 4.28, она бесплатна.
          +1
          именно об этой программе я и подумал когда читал статью :) уже года 2 пользуюсь. спасибо вам за нее!
        0
        К сожалению со sleep/wake такая шЮтка почему-то не проходит. Менял 63 E0 на 5F E0.
          0
          возможно в вашей клаве другой скан-код на эту кнопку.
          Снимите свой скан указанной программой. и напишите итоги
            0
            «расскажу как без дополнительного установленного ПО»… «вы можете используя программу „KeyboardTest“ от разработчика»
            Сам юзаю Keytouch для Logitech Wave в линуксе :)
              +1
              Придирка не засчитана -) я написал "… а если у вас супер новая клавиатура с кнопками космического происхождения...". Так, как сейчас выходят множества модификаций разных клав, с новыми кнопками, скан-коды которых еще не известны, в таких случаях нужно ПО для определения этого скан-кода. Та что теоретических ПО мы для непосредственного Ремаппинга не используем.
                +1
                А что делать, когда KeyboardTest не реагирует на то, что мне надо? Вот хочу кнопки громкости переназначить на «следующий/предыдущий трек». А прога не реагирует на их нажатия :(

                P. S. А громкость этими кнопками регулируется без проблем.
                  0
                  Media Keys в таблице Scan Code
                    0
                    А может, в случае с громкостью клавиатура вообще не посылает никаких скан-кодов, а напрямую вызывает функции ОС через драйвер клавиатуры? Потому таким способом и не получится переназначить — только через драйвера.
                    Вообще, интересный подходв реализации ремаппинга был уличен мной как раз в дровишках логитека, правда, для мыши. Стандартными средствами SetPoint мало что можно было сделать, но, если покопатьсся в XML, можно переназначить что угодно куда угодно, даже можно назначить разные функции кнопок на разные программы. Возможно, для клавиатур у логитека тоже нечто похожее есть.
                      0
                      В точку! В ноутбучной проге, что автозагружается и разные Advanced HotKeys ловит отрубил «Advanced Volume» и скан-коды начали ловиться.

                      Вот только «BIOS Key code», который, как я понял, и нужен, выдаёт нули. «Windows Key code» тут никак не подойдёт?
                        0
                        Windows key code наверняка можно использовать, но надо найти чем. попробую найти значения
                          0
                          Вот это попробуйте, если вы с логитеком боритесь
                            0
                            Спасибо, удобная штука. Отобразила изменения, которые я до этого вручную внёс в реестр (кнопки громкости из приведённой выше таблицы), которые, кстати, ничего не изменили.

                            Выбрал «Type Key», он считал «00_100» для всех трёх кнопок управления громкостью: up, down и mute. Добавил, что не знает такой кнопки и предложил сходить на сайт за обновлениями.

                            Вот такая вот ерунда :)

                            P. S. Logitech Internet 350 Keyboard
                              0
                              ну блин, не обязательно считывать, там же есть кнопки Volume Up,Down,Mute пробуйте их.
                          0
                          их все равно обрабатывает подпрограмма в биос. а потом передает в ОС.
                    0
                    О! Спасибо, не знал, что можно так просто. Я тоже мучаюсь с тем, чтобы ctrl+shift слева нажимать, приходится немножко руку выворачивать :)
                      +23
                      Боже, убей тех, кто ставит левый Fn заместо Ctrl
                        +1
                        Fn к сожалению не переназначить…
                        а так бы можно их физически местами переставить если б программно все было как надо
                          +6
                          О горе мне… я только этим и горел читая пост… :(
                            0
                            проблема в том, что обработка Fn дальше биоса не уходит. Так что вариант один, как мне кажется, патчить БИОС. Однажды мне сказали, что видели подобное решение, но сам я не встречал.
                              0
                              У меня Samsung Q320. Особенность местных клавиш Fn — они не работают без установки программы Magik Beyboard. То есть клавиши Fn судя по всему обрабатываются в этом буке программно. Только вот незадача — в программу зашиты стандартные комбинации клавиш и изменить их нельзя. А остальные программы не видят клавиши Fn.
                                0
                                програмно обрабатывается скан-код выдаваемый операционой системе сочетанием клавиш Fn+(другая-кнопка). Отдельно нажатие Fn не передаётся и отловить его врядли получится. Буду рад если окажется, что я ошибаюсь, но это маловероятно.
                              +1
                              AutoHotKey умеет понимать нажатие Fn.
                              С моей блютусной клавой справился только он.
                                0
                                Кстати говоря, на моём ноутбуке (Toshiba) он же только и видит мультимедийные клавиши.

                                Mini how-to от меня:

                                1. В свой скрипт (можно в тот пример, что создаётся при первом запуске) добавляем строчку
                                #InstallKeybdHook

                                2. Открываем окно AHK (щёлкаем по иконке в трее) и жмём Ctrl+K.

                                3. Перед нами список событий клавиатуры. Новые добавляются вниз, обновление по F5.

                                Для Fn получили:
                                Virtual Key = 0xFF
                                Scan Code = 174 (0xAE)

                                Для Play/Pause:
                                Virtual Key = 0xFF
                                Scan Code = 177 (0xB1)

                                Для Stop:
                                Virtual Key = 0xFF
                                Scan Code = 112 (0x70)

                                Не знаю, кому это может быть интересно, но тем не менее:
                                Virtual Key 0xFF, согласно этому списку, означает мультимедийные клавиши.
                                Из Keyboard Scan Code Specification (онлайн), Appendix C: USB Keyboard/Keypad Page (0x07), видно, что SC 112 — это некий Keyboard F21, а SC 174 и SC 177 находятся в зарезервированной области.

                                Не пойму, зачем было использовать свои сканкоды для Play/Pause и Stop, когда для этого уже существуют отдельные Virtual key = 0xB3 и 0xB2.
                                  0
                                  Точнее, последняя фраза должна звучать так:
                                  Не пойму, почему для Play/Pause и Stop (ну и Next, Prev тоже) нельзя было сразу назначить правильные Virtual Key Code.

                                  В AHK это можно сделать так:

                                  sc177::
                                  Send {vkB3}
                                  return

                                  или так:

                                  sc177::
                                  Send {Media_Play_Pause}
                                  return

                                  Но если я не хочу держать перманентно запущенный AHK, этот вариант мне не подходит.
                                    0
                                    К сожалению с яблоклавой все еще сложнее, т.к. сканкодов вообще нет…
                              0
                              Хм, а у меня на msi wind u100 fn и ctrl меняются местами прошивкой биоса.
                                0
                                на моем Lenovo Y450 (Win 7) удалось при помощи нижеописанной SharpKeys сделать как НАДО :) моя счастлив, мне говорили, что это невозможно
                                  0
                                  Мне тоже говорили что обе \ имеют один код =) не верь никому пока не проверишь сам.
                                    0
                                    правда замечен один нехороший глюк — не работает сочетание Ctrl(то есть теперь Fn)+W
                                      0
                                      странно, мой новопереназначенный Шифт из топика, справляется с функциями Шифта полностью, то есть Шифт+все работает как нужно.
                                        0
                                        странно, но все работает, если сочетание нажимать быстро. если держать клавишу зажатой — не работает
                                          0
                                          у меня работает. но скорее всего что то перехватывает состояние этой клавиши у вас. так как у клавиши не один скан-код, если поковырятся в спецификации то будет ясно что при нажатом и отпущенном состоянии одна кнопка имеет два разных скан-кода. А на уровней драйверов клавиатур наверняка есть вычисления press hold и release
                                            0
                                            скан-код нажатой через SharpKeys уже не переназначается
                                –2
                                Дело привычки.
                                  +1
                                  Скорее отзвуки идиотизма
                                    –1
                                    Причем здесь идиотизм?

                                    Согласен, что backslash рядом с левым шифтом — это идиотизм, но Ctrl сделать ближе к пальцам левой руки — нет.
                                      –2
                                      Заебали ваши предрассудки.
                                  0
                                  В этой клаве к счастью Fn справа =) они наверное свои ошибки осознают, но полностью от идеи отказываться не хотят. =)
                                    0
                                    Часто в настройках биосов ноутов (по крайней мере, в Асусах регулярно наблюдал) Fn и Ctrl можно поменять местами.
                                    0
                                    А я утилитку написал для этого, удобно профили менять для разных программ. Вот только с играми не дружит.
                                      0
                                      О боже, зачем же так сурово?
                                      У самого клавиатура Logitech Classic 200, мне не нравилось, что над стрелкой вверх расположен инсерт, который нафиг ненужен нигде, а не End. Я переткнул клавиши на клавиатуре, и в системе с помощью утилитки KeyTweak. Не нужно лезть в реестр. После ремапа утилитку можно удалить, для работы она не требуется.
                                        0
                                        insert это как оказалось тоже дело привычки, и на практике процентов 20 людей используют не CTRL+V а именно SHIFT+INS
                                        +1
                                        Хороший пост.
                                        В итоге у вас, слева, есть два шифта размером с обычную кнопку. Конечно, удобней чем было, но видимо все равно ужасно неудобно, я прав?
                                          0
                                          да нет, на обычной клаве возможно было бы неудобно, а на этой тонкой, действительно если не смотреть на эти две кнопки, кажется что она одна и не испытываешь неудобств.
                                          +1
                                          Есть очень удобная прога не требующего постоянного наличия в системе или авторана

                                            +2
                                            забыл ссылку — SharpKeys 3

                                            teutonick.ru/download/sharpkeys3.zip

                                            Всего лишь установили, переназначили, ребут и можете сносить…
                                            Не требует знания ключей реестра
                                              0
                                              я уже потерял надежду переназначить Ctrl на место Fn на своем Lenovo Y450, а эта программа все сделала! спасибо
                                                0
                                                Fn поменяла??? Интереесно… на моей тошибе не захотела…
                                                0
                                                я эту прогу указал в посте, правда не указывал версию
                                                  0
                                                  Прости, не заметил ((
                                              +1
                                              Надо попробовать переназначить 2 бесполезных кнопки "€" и "$" над кнопками управления курсором на своем Aspire 5720
                                                +7
                                                "… и перезагрузите ПК"

                                                Хорошо б снабдить все компьютеры с виндой системой обратной связи, чтоб после каждой перезагрузки, вызванной идиотизмом разработчика ОС, по одному программисту М$ сгорало в специальной печи, с трансляцией видео на рабочие места остальных.
                                                  +4
                                                  ну сейчас мода такая, мак ос теперь тоже после каждого чиха рестартится. А помню было время…
                                                    –1
                                                    Ландо винда, среди убунтоидов полно советчиков, полагающих, что после изменения настроек иксов или установки какого-либо модуля ядра надо обязательно перезагрузиться… И ведь не ленятся свой бред на видео записываьи на «твойтруба» публиковать
                                                    0
                                                    У меня ноутбук, и время от времени я его использую с разными внешними клавиатурами. Можно ли переназначить клавиши для конкретной клавиатуры? Было бы очень полезно.
                                                      0
                                                      ну для этого наверняка есть какие-то утилиты. Ну или попробуйте спецификации почитать, может это как-то через реестр оформить можно
                                                        0
                                                        могу конечно посоветовать сделать настройки для каждой клавы.
                                                        Создать конфиг изменяемых сканов в отдельный reg-файл как у яказал в посте. и обозвать из например:
                                                        Standart.reg
                                                        Logitech_illum.reg
                                                        Genius_Slim_KB-100.reg
                                                        и т.д. и запускать тот рег который соответствует вашей подключенной клавиатуре.
                                                        +1
                                                        А меня бесит когда Enter как почти как Shift, когда над ним делают клавишу с /
                                                          0
                                                          Луч циакринового поноса дизайнерам Logitech?
                                                          0
                                                          есть еще такая программа, как MKey
                                                            0
                                                            программа хорошая, только разрабатываться перестала…
                                                            есть в ней косяк — она регулирует громкость только фронтальных колонок
                                                              0
                                                              не-не-не, ее разработка возабновлена(моей радости не было предела, как узнал), и более того жив форум и автор прислущивается к багтреку и фичер-риквесту
                                                                0
                                                                да, действительно
                                                                поставил 1.1.6

                                                                после того, как перешёл с apollo на foobar2000 (в которой есть родные хоткеи), использовал mkey как OSD-индикатор громкости, но вот есть проблема, что через mkey меняется только фронтальный выход осталась, так что выключил пока, до лучших времён :)
                                                            0
                                                            А я всегда мечтал о 2-х клавиатурах, подключенных к одной машине. На одной непосредственно работаешь, а на второй — шорткаты клякаешь. Вот это мило бы было. Эххх(
                                                              0
                                                              Я, конечно, понимаю, что прошло 10 лет, но, может быть, эта мечта всё ещё актуальна.
                                                              Когда-то задался для себя этой целью и нашёл программу HIDMacros. Она как раз отлично справлялась с двумя клавами: на одной можно было поставить шорткаты на клавиши так, что те теряли изначальное предназначение, при этом на другой у клавиш оставался прежний смысл. Даже пользовался какое-то время так двумя клавиатурами, но потом надоело.
                                                              Есть, правда, ложка дёгтя: программа больше не развивается автором, а на новых осях уже не работает (личный опыт: на WinXP x86 работала, на Win7 x64 уже нет). Хотя вместо неё автор мутит LuaMacros. Но ей лично я не пользовался, поэтому ничего уже сказать не могу.
                                                              +2
                                                              Для линукса:
                                                              1. Запустить xev, чтобы узнать код клавиши
                                                              2. Cоздать файл ~/.xmodmaprc и записать в него

                                                              keycode = Shift_L
                                                              add shift = Shift_L

                                                              3. Выполнить xmodmap ~/.xmodmaprc

                                                                0
                                                                немного не в тему, но спрошу:
                                                                можно ли как нибудь в линуксе назначить на произвольную клавишу действия копировать/вставить.
                                                                п.с. искал очень долго, так и не нашел.
                                                                п.п.с. клавиатура a4 kbs-26 — мультимедийная, дров естественно нет :(.
                                                                  0
                                                                  Через настройки wm можно замепить на кнопку с известным кодом запуск скрипта с нужным действием. Пару лет назад в kde3 я это делал через связку dbus+klipper, в wmii через найденный где-то демон на руби.
                                                                +1
                                                                Все это к мышке тоже относится? Хочу переназначить дополнительные кнопки мыши на клавиатурные кнопки.
                                                                  0
                                                                  если вы пройдете на сайт Sharpkeys там я вчера видел подобную программку лоя мышек. попробуйте.
                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                    +2
                                                                    для пользы дела забыли сказать что программа называется
                                                                    Microsoft Keyboard Layout Creator
                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                    0
                                                                    Огромное спасибо автору — пришел конец мучениям с шифтом :)
                                                                      0
                                                                      Эх… занимался я этим… почему же не захотел писать статью?)

                                                                      А меня sharp keys (да, я не люблю копаться в реестре с теми нулями) да и она очень адекватно сделана, хотя и требует net зачем-то. Совсем офигели.)

                                                                      Я с радостью перенес Win чтобы нажимать WIN+R одной рукой,
                                                                      и поселил чертов caps подальше…

                                                                      А также сделал себе кнопку, которая в русской раскладке вставляет сразу запятую без шифта. (MS Keyboard layout creator + sharpkeys для переноса Insert который вечно сам нажимался..)
                                                                        0
                                                                        еще одна софтинка-переназначатель, с гуем: justkeepswimming.net/keymapper/default.aspx
                                                                        Free Image Hosting at www.ImageShack.us
                                                                          0
                                                                          Левая кнопка "\" очень ценна для уркаинского языка потому что на енй по умолчанию располагается буква "Ґ", которую фиг найдешь иначе.
                                                                            0
                                                                            В украинской версии клавиатур логитек на этой клавише твердая буква г
                                                                              0
                                                                              у меня тоже лоджитек, и каждый раз видель слеш возле левого шифта – для меня открытие

                                                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                              Самое читаемое