Начальная страница  |  Переопределение клавиш

Переопределение клавиш:  некоторые технические детали

В прежних версиях KeyCode.exe скан-коды в десятичном виде определялись как представление их числовых значений, без учета, являются последние однобайтовыми или двухбайтовыми числами. Например, значение cкан-кода клавиши «правый Ctrl» показывалось как E0 1D в шестнадцатеричной форме и как 57 373 – в десятичной. Формально такой механистический подход был, возможно, верен. Однако, дело в том, что оба байта скан-кода имеют разное назначение. Старший байт (первый по порядку, если читать слева направо), имеющий значение 00, E0 или E1, обозначает принадлежность клавиши к одной из двух категорий: обычные клавиши и клавиши т.н. расширенной клавиатуры. Разница эта возникла исторически при вводе новой на тот момент (1986 год) клавиатуры стандарта MF2, именуемой также extended AT или PS/2. В наше время префикс E0 получают новые клавиши, например, мультимедийные. Младший байт первоначально имел непосредственное отношение к физическому расположению клавиши. Со временем эта связь сильно ослабла, не исчезнув окончательно. Иными словами, эти байты никогда не складываются, а рассматриваются по-отдельности. По этой причине десятичное представление двухбайтовых значений смысла не имеет. В последней версии KeyCode.exe в правых полях сегментов скан-кодов всегда показывается значение только младшего байта в десятичной форме. Постфикс ext добавляется в случае, если значение старшего байта не равно 0.

Несколько слов о скан-кодах. Сигналы, которые вырабатывает конкретная клавиатура, могут быть разными: Это может быть один из трех классических наборов – Set 1, 2 (чаще всего) или 3 – для клавиатур, присоединяемых к специальному, клавиатурному разъему, либо USB, либо – вполне допускаю – еще что-то совершенно другое. В компьютере эти наборы преобразуются в набор Set 1, использовавшийся еще в клавиатурах IBM PC/XT. Это преобразование происходит на очень ранней ступени, поэтому в большинстве случаев можно исходить из того, что операционная система и приложения работают именно с этими скан-кодами. Как минимум, это справедливо для переопределения клавиш с помощью Scancode Map.

Естественно, клавиатура PC/XT не знала в 1981 году такой кнопки как «Запуск Интернет-браузера» или подобное. Поэтому тот набор скан-кодов, который используется современным компьютером, можно назвать «расширенный Set 1», или даже – расширяемый. Ядро этого набора осталось неизменным с начала 1980-х годов. Дополнением к нему служат две другие группы клавиш (и их скан-кодов), которые разграничиваются по признаку стандартизированности: стандартизированные клавиши и такие, которые используются лишь в компьютерах отдельных производителей. Примером последних являются «валютные» клавиши в ноутбуках фирмы Acer.

Стандартизированные клавиши не составляют гомогенной группы. Их также можно поделить на две категории. Во-первых, это клавиши, список которых приведен в упомянутом документе Microsoft (scancode.doc), который, на мой взгляд, обозначает некий «водораздел». Типичная клавиатура, соответствующая этому стандарту – это, по сути, уже упомянутая выше MF2-клавиатура с тремя специфическими клавишами: 2 x Windows и Application, но без каких-либо мультимедийных расширений. Такие клавиатуры до сих пор выпускаются и поставляются для использования в офисах. Во-вторых, это все те клавиши, которые появились после опубликования данного документа, датированного 16 марта 2000 года. Примерами новых стандартизированных клавиш являются «Запуск Интернет-браузера» и «Запуск почтовой программы». Представление о клавишах, поддерживаемых в современных версиях Windows, может быть получено из этого списка.

Несколько слов о «сложных» клавишах: Pause, Num Lock и PrtScr. Из файла scancode.doc следует, что скан-коды клавиши PrtScr: E0 2A и E0 37, а клавиши Pause: E1 1D 45 и E1 9D C5. Правда, непонятно, по какому принципу выбирается тот или иной скан-код, либо они даже генерируются последовательно. Но, как показывают эксперименты, для PrtScr можно ограничиться использованием последних двух байт, или, точнее, первых (и здесь играет роль обратный порядок записи). Иными словами, четырехзначная комбинация, которая должна быть внесена в реестр, для этой клавиши будет выглядеть как 37 E0.

Ситуация с Pause и Num Lock более запутанная и, судя по всему, зависит от конкретного компьютера (и установленной на нем операционной системы). На нескольких ноутбуках, выпущенных в разное время и с разными версиями Windows, можно наблюдать следующую картину. При нажатии клавиши Pause генерируется скан-код 0xE11D, который после этого преобразуется в 0x45. Клавиша Num Lock, эмулируемая с помощью Fn, проходит почти противоположную трансформацию: первоначальный скан-код 0x45 преобразуется в 0xE045. Я могу лишь попытаться объяснить это: примеры программирования раскладок клавиатуры от Microsoft содержат в списках скан-кодов последние значения. Возможно, что современные версии Windows ожидают именно их, а не те, которые были указаны в файле scancode.doc.

 

Copyright А. Г. Румянцев, 2011/2019 MailBox