Как найти код клавиши на клавиатуре

Обновлено: 21.11.2024

Данные с клавиатуры в основном поступают в виде скан-кодов, создаваемых нажатием клавиш или используемых в протоколе с компьютером. (Встроенная прошивка клавиатуры использует различные коды, а также существует несколько наборов скан-кодов. Здесь в этом разделе мы говорим только о кодах по умолчанию — кодах из переведенного набора скан-кодов 2. Менее распространенные режимы обсуждаются ниже.) Каждое нажатие клавиши при отпускании клавиши создается от 0 до 6 скан-кодов.

1.1 Выпуск ключа

Ниже я упомяну только скан-код для нажатия клавиши ("make"). Скан-код для отпускания клавиши ("break") получается из него установкой старшего бита (добавлением 0x80 = 128). Таким образом, нажатие Esc создает скан-код 01, Esc отпускает скан-код 81 (шестнадцатеричный). Для последовательностей все аналогично: Keypad-/ дает e0 35 при нажатии, e0 b5 при отпускании. Большинство клавиатур будут повторять код создания (код нажатия клавиши) при повторении клавиши. Некоторые также имитируют события Shift down и Shift up во время повтора.

Клавиши PrtSc/SysRq и Pause/Break являются специальными. Первый создает код сканирования e0 2a e0 37, когда одновременно не нажимается ни одна клавиша-модификатор, e0 37 вместе с Shift или Ctrl, но 54 вместе с (левым или правым) Alt. (И один получает ожидаемые последовательности при отпускании. Но см. Ниже.) Последний выдает последовательность скан-кода e1 1d 45 e1 9d c5 при нажатии (без модификатора) и вообще ничего при отпускании. Однако вместе с (левым или правым) Ctrl получается e0 46 e0 c6 , и снова ничего при отпускании. Это не повторяется.

См. ниже отчет о ключах с другим поведением.

Есть много сообщений о ноутбуках, в которых события нажатия клавиши были плохо обработаны. Таким образом, неожиданные события нажатия клавиш, вероятно, следует рассматривать как обычные и игнорировать их. Другим источником событий нажатия клавиши без предшествующего нажатия клавиши может быть поддельный сдвиг.

1.2 Скан-коды протоколов

Большинство скан-кодов указывают на нажатие или отпускание клавиши. Некоторые используются в протоколе связи.


< TD>BAT (базовый контрольный тест) OK
00 Ошибка клавиатуры — см. ff
aa
ee Результат эхо-команды
f1 Некоторые клавиатуры, как ответ на команду a4 :Пароль не установлен
fa Подтверждение от kbd
fc Ошибка BAT или ошибка передачи мыши
fd Внутренний сбой
fe Клавиатура не подтверждается, отправьте повторно
ff Ошибка клавиатуры< /TD>

Обычно эти коды имеют протокольное значение. Однако они также встречаются как настоящие скан-коды, особенно с префиксом e0 .

1.3 Экранирующие скан-коды

Коды e0 и e1 вводят последовательности скан-кодов и обычно не используются как отдельные скан-коды (но см. ниже).

(Префикс e0 изначально использовался для серых дубликатов клавиш на оригинальной клавиатуре PC/XT. В наши дни e0 используется только для расширения пространства кода. Префикс e1, используемый для паузы/брейка, указывает, что эта клавиша отправляет /break последовательность во время создания и ничего не делает после выпуска.)

Это и приведенное выше означает, что значения 00 , 60 , 61 , 6e , 71 , 7a , 7c , 7e , 7f недоступны для обозначения нажатия клавиш (на клавиатуре по умолчанию). Тем не менее, они также встречаются в виде скан-кодов, см., например, клавиатуры Telerate и Safeway SW23 ниже.

Также встречаются и другие префиксы, см. ниже.

Logitech использует префикс e2 для кодов, отправляемых указывающим устройством, встроенным в клавиатуру.

1.4 Обычные скан-коды

Скан-коды в переведенном наборе скан-кодов 2 представлены в шестнадцатеричном формате. В скобках колпачок на клавиатуре США. Скан-коды даны по порядку, сгруппированы в соответствии с группами клавиш, которые обычно находятся рядом друг с другом.

00 обычно является кодом ошибки

0f (Tab), 10 (Q), 11 (W), 12 (E), 13 (R), 14 (T), 15 (Y), 16 (U), 17 (I), 18 ( О), 19 (П), 1а ([<), 1б (]>)

1e (А), 1f (S), 20 (D), 21 (F), 22 (G), 23 (H), 24 (J), 25 (K), 26 (L), 27 ( ;:), 28 ('")

2b (\|) на 102-клавишной клавиатуре

2c (Z), 2d (X), 2e (C), 2f (V), 30 (B), 31 (N), 32 (M), 33 (, 34 (.>), 35 (/ ?), 36 (RShift)

37 (Keypad-*) или (*/PrtScn) на 83/84-клавишной клавиатуре

38 (LAlt), 39 (пробел),

3b (F1), 3c (F2), 3d (F3), 3e (F4), 3f (F5), 40 (F6), 41 (F7), 42 (F8), 43 (F9), 44 ( F10)

47 (Keypad-7/Home), 48 (Keypad-8/Up), 49 (Keypad-9/PgUp)

4b (Клавиатура-4/Левая), 4c (Клавиатура-5), 4d (Клавиатура-6/Право), 4e (Клавиатура-+)

4f (Клавиатура-1/Конец), 50 (Клавиатура-2/Вниз), 51 (Клавиатура-3/PgDn)

52 (Клавиатура-0/Вход), 53 (Клавиатура-./Удаление)

54 (Alt-SysRq) на 84-клавишной клавиатуре и выше

55 встречается реже; происходит напр. как F11 на клавиатуре Cherry G80-0777, как F12 на клавиатуре Telerate, как PF1 на клавиатуре Focus 9000 и как FN на IBM ThinkPad.

56 в основном на неамериканских клавиатурах.Часто это немаркированная клавиша слева или справа от левой клавиши Alt.

57 (F11), 58 (F12) на клавиатуре от 101 клавиши

59 - 5а -. - 7f встречаются реже. Назначение по сути случайное. Скан-коды 55–59 встречаются как F11–F15 на клавиатуре Cherry G80-0777. Скан-коды 59 - 5c встречаются на клавиатуре RC930. X вызывает 5d `KEY_Begin'. Скан-коды 61–64 встречаются на клавиатуре Telerate. Скан-коды 55, 6d, 6f, 73, 74, 77, 78, 79, 7a, 7b, 7c, 7e встречаются на клавиатуре Focus 9000. Коды сканирования 65, 67, 69, 6b встречаются на клавиатуре Compaq Armada. Скан-коды 66–68, 73 встречаются на клавиатуре Cherry G81-3000. Коды сканирования 70 , 73 , 79 , 7b , 7d встречаются на японской клавиатуре 86/106.

Сканкоды f1 и f2 встречаются на корейских клавиатурах.

1.5 Экранированные скан-коды

Кроме клавиши Pause/Break, у которой есть escape-последовательность, начинающаяся с e1 , используется escape-последовательность e0 . Часто коды выбираются таким образом, что происходит что-то значимое, когда получатель просто отбрасывает e0 .


<ГРАНИЦА ТАБЛИЦЫ> e0 1c (Ввод с клавиатуры) 1c (Ввод) e0 1d (RCtrl) 1d (LCtrl) e0 2a (фальшивый LShift) 2a (LShift) < /TR> e0 35 (клавиатура-/) 35 (/?) e0 36 (фальшивый RShift) 36 (RShift) e0 37 (Ctrl-PrtScn) 37 (*/PrtScn) e0 38 (RAlt) 38 (LAlt) e0 46 (Ctrl-Break) 46 (ScrollLock) e0 47 (Серый Дом) 47 (Клавиатура-7/Дом) e0 48 (Серый вверх) 48 (Клавиатура-8/Стрелка вверх) e0 49 (Серый PgUp) < TD>49 (Keypad-9/PgUp) e0 4b (Серый слева) 4b (Keypad-4/Left) < /TR> e0 4d (Серый справа) 4d (Клавиатура-6/справа) e0 4f (Серый конец) 4f (Клавиатура-1/Конец) e0 50 (Серый вниз) 50 (Клавиатура-2/Стрелка вниз) e0 51 (Серый PgDn) 51 (Клавиатура-3/PgDn ) e0 52 (Серая вставка) 52 (Клавиатура-0/Ins) e0 53 (Серый Удалить) 53 (Клавиатура-./Del)

Эти экранированные скан-коды встречаются только на клавиатурах со 101+ клавишами. Клавиатура Microsoft добавляет


<ГРАНИЦА ТАБЛИЦЫ> e0 5b (левое окно) e0 5c (правое окно) < TR> e0 5d (Меню)

Присутствуют другие экранированные скан-коды — см. ниже для отдельных клавиатур.

1.6 Поддельные смены

Десять серых клавиш Insert, Home, PgUp, Delete, End, PgDn, Up, Left, Down, Right должны работать независимо от состояния клавиш Shift и NumLock. Но на старой клавиатуре AT клавиши клавиатуры выдавали цифры, когда была включена Numlock или нажата клавиша Shift. Поэтому, чтобы обмануть старые программы, отправляются поддельные скан-коды: при нажатой LShift и нажатии Insert отправляется e0 aa e0 52; при выпуске Insert отправляется e0 d2 e0 2a. Другими словами, вставляются поддельные LShift-up и поддельные LShift-down.

Если клавишу Shift отпустить раньше, чем повторяющуюся клавишу, то происходит настоящий код Shift-up (без предшествующего фальшивого Shift-down), так что программа, игнорирующая e0, увидит на один Shift-up больше, чем Shift-down.< /p>

Когда NumLock включен, поддельные смены не отправляются, когда Shift был нажат, но поддельные смены отправляются, когда Shift не нажат. Таким образом, с Numlock, если нажать Insert, отправляется e0 2a e0 52, а при отпускании отправляется e0 d2 e0 aa. Клавиатура поддерживает частный режим NumLock, который переключается при нажатии NumLock и устанавливается, когда горит индикатор NumLock.

Точно так же, когда Shift нажата, серая клавиша / создает фальшивые последовательности Shift-up и Shift-down. Однако он никак не реагирует на состояние NumLock. Цель, конечно, состоит в том, чтобы обмануть программы, которые идентифицируют Grey-/ с обычным /, чтобы они не рассматривали Shift-Grey-/ как Shift-/, т. е. ?.

На ноутбуке Toshiba три клавиши Windows обрабатываются как упомянутая группа из десяти клавиш и получают ложные сдвиги, когда (влево или вправо) нажата клавиша Shift. Они не реагируют на NumLock.

1.7 Добавлены неподдельные смены

На моей 121-клавишной клавиатуре Nokia Data есть функциональные клавиши F1, . F24, где F1, . F12 отправить ожидаемые коды 3b , . 58 и F13, . F24 отправляет те же коды вместе с кодом LShift 2a. Таким образом, F13 дает 2a 3b при нажатии и bb aa при отпускании. Точно так же есть клавиши с добавленным кодом LCtrl 1d. Но есть и ключи с добавленными ложными сдвигами e0 2a .

Делори сообщает, что клавиатура "Preh Commander AT" с дополнительными клавишами F11-F22 обрабатывает F11-F20 как Shift-F1..Shift-F10, а F21/F22 как Ctrl-F1/Ctrl-F2; клавиатура Eagle PC-2 с клавишами F11–F24 обрабатывает эти дополнительные клавиши таким же образом .

1.8 Турбо-режим

На некоторых материнских платах клавиши LCtrl-LAlt-GreyPlus и LCtrl-LAlt-GreyMinus включают/выключают режим Turbo соответственно.Для них материнская плата может генерировать одну и ту же последовательность скан-кодов при нажатии кнопки Turbo: Turbo Switch (High->Low): 1d 38 4a ce b8 9d и Turbo Switch (Low->High): 1d 38 4e ce b8 9d .

Другие необычные комбинации в этом стиле включают LCtrl-LAlt-LShift-GreyMinus и LCtrl-LAlt-LShift-GreyPlus для включения/выключения системного кеша.

Если в настройках AMIBIOS включен режим энергосбережения системы Green PC, контроллер клавиатуры AMI MegaKey распознает комбинации Ctrl-Alt-\ (перевод системы в режим немедленного отключения питания), Ctrl-Alt-[ (отключение режима Green PC режим энергосбережения временно), Ctrl-Alt-] (включает режим отключения питания Green PC).

1.9 Энергосбережение

Microsoft рекомендует: «На клавиатурах на базе i8042 должны использоваться следующие коды сканирования для кнопок управления питанием, т. е. кнопок POWER и SLEEP:


<ГРАНИЦА ТАБЛИЦЫ> Set-1 make/break Set-2 make/break Сила e0 5e / e0 de e0 37 / e0 f0 37 Сон e0 5f / e0 df e0 3f / e0 f0 3f Wake e0 63 / e0 e3 e0 5e / e0 f0 5e

Коды сканирования событий "Питание", "Сон" и "Пробуждение" являются i8042 эквивалентными использованиям HID для отключения питания системы, перехода системы в спящий режим и пробуждения системы".

На многих клавиатурах есть клавиши Power/Sleep/Wake, которые необходимо активировать четвертой клавишей (без маркировки или с маркировкой FN): нажатие одной из этих четырех клавиш не приводит к скан-кодам, но при одновременном нажатии клавиши FN клавиши Power/Sleep/Wake дают коды, перечисленные выше.

1.10 Инициализация специальных клавиатур

На многих клавиатурах больше клавиш и кнопок, чем на стандартных. Иногда эти дополнительные клавиши создают комбинации скан-кодов, которые ранее не использовались. Но на другой клавиатуре такие дополнительные клавиши вообще не производят никакого кода, пока не будет выполнено какое-либо действие по инициализации.

Иногда это действие состоит в записи нескольких байтов в регистры клавиатуры. См., например, клавиатуру IBM Rapid Access и клавиатуру Omnibook.

1.11 Управление дополнительными светодиодами

Некоторые клавиатуры имеют дополнительные светодиоды, и в некоторых случаях мы знаем, как ими управлять.

Для клавиатуры Chicony требуются последовательности команд eb 00 xy , где xy = 01 для светодиода Moon и xy = 02 для светодиода zzZ.

Для клавиатуры IBM EZ Button требуются последовательности команд eb 00 xy , где xy = 01 для индикатора Msg, xy = 02 для индикатора CD, xy = 04 для индикатора питания, xy = 10 для индикатора Talk и xy = 20 для индикатора ожидающего сообщения.

Для клавиатуры IBM Rapid Access требуются последовательности команд eb 00 xy , где xy = 04 для индикатора Suspend и xy = 20 для индикатора Mute.

Для клавиатуры IBM Rapid Access II требуются последовательности команд eb 71 и eb 70 для включения и выключения индикатора режима ожидания.

Интернет-клавиатура Logitech оснащена дополнительным желтым индикатором. Он включается отправкой eb , а затем мигает примерно раз в секунду. Он снова отключается с помощью ec .

1.12 Клавиша FN ноутбука

На ноутбуках нет места для всех бессмысленных клавиш, которые обычно можно найти на обычной клавиатуре. Итак, цифровой блок и другие клавиши свернуты в основную часть клавиатуры. Клавиша без метки или с маркировкой FN часто используется для изменения значения других клавиш. Эта FN сама не создает скан-коды, она только изменяет скан-коды, созданные другими клавишами.

Нил Браун сообщает о своем ноутбуке Dell Latitude D800, что он имеет пять комбинаций клавиш, которые не создают правильных кодов прерывания. Пять комбинаций FN+F2, FN+F3, FN+F10, FN+Вниз, FN+Вверх (обозначенные как Wireless, Brighter, Darker, Battery, CDEject) дают коды производителя e0 08 , e0 07 , e0 09 , e0 05 , e0 06 соответственно. Первые три не создают никакого кода прерывания. Последние два имеют код прерывания, который идентичен коду сборки.

Необходимым условием для изменения сопоставления клавиш является знание того, как нажатие клавиши приводит к появлению символа:

  1. Клавиатура отправляет скан-код на компьютер.
  2. Ядро Linux сопоставляет скан-код с кодом клавиши, см. раздел Сопоставление скан-кода с кодом клавиши.
  3. Раскладка клавиатуры сопоставляет код клавиши с символом или символом клавиши в зависимости от того, какие клавиши-модификаторы нажаты.
    • Информацию о консоли Linux см. в разделе Конфигурация консоли/клавиатуры Linux.
    • Информацию о Xorg и Wayland см. в разделе Конфигурация Xorg/Keyboard.

Большинство ваших ключей уже должны иметь код ключа или хотя бы скан-код. Ключи без scancode не распознаются ядром; это могут быть дополнительные клавиши от «игровых» клавиатур и т. д.

Содержание

Идентификация скан-кодов

Использование showkey

Традиционный способ получить скан-код — использовать утилиту showkey(1). showkey ожидает нажатия клавиши или завершает работу, если ни одна клавиша не была нажата в течение 10 секунд. Чтобы showkey работал, вам необходимо находиться в виртуальной консоли, а не в графической среде или входить в систему через сетевое соединение.Выполните следующую команду:

и попробуйте нажимать клавиши клавиатуры; вы должны увидеть скан-коды, распечатываемые на выходе.

Использование evtest

Для USB-клавиатур очевидно необходимо использовать evtest(1) из пакета evtest вместо showkey [1]:

Совет: Если вы не знаете, какой номер события имеет интересующее вас устройство, вы можете запустить evtest без параметров, и он покажет вам список устройств с их номерами событий, после чего вы можете ввести нужный номер.

Используйте поле «значение» MSC_SCAN . В этом примере показано, что NumLock имеет код сканирования 70053 и код клавиши 69.

Использование dmesg

Вы можете получить скан-код ключа, нажав нужную клавишу и просмотрев вывод dmesg. Например, если вы получаете:

тогда scancode вам нужен 0xa0 .

Идентификация кодов клавиш

Коды клавиш Linux определены в файле /usr/include/linux/input-event-codes.h (см. переменные KEY_).

Определение кодов клавиш в консоли

Коды клавиш для виртуальной консоли сообщает утилита showkey(1). showkey ожидает нажатия клавиши и, если не нажимается, через 10 секунд завершает работу. Чтобы выполнить showkey, вам нужно находиться в виртуальной консоли, а не в графической среде. Выполните следующую команду:

и попробуйте нажимать клавиши клавиатуры; вы должны увидеть, что коды клавиш печатаются на выходе.

Определение кодов клавиш в Xorg

Эту статью или раздел необходимо расширить.

Причина: xev также сообщает о keysyms. Упомяните, что вам нужно сфокусировать окно «Тестер событий». (Обсудить в Talk:Ввод с клавиатуры)

Коды клавиш, используемые Xorg, сообщает утилита под названием xev(1), которая предоставляется пакетом xorg-xev. Конечно, чтобы выполнить xev, вам нужно быть в графической среде, а не в консоли.

С помощью следующей команды вы можете запустить xev и показать только соответствующие части:

Вот пример вывода:

Xbindkeys — это еще одна оболочка для xev, которая сообщает коды клавиш.

Если вы нажимаете клавишу, а в терминале ничего не появляется, это означает, что либо клавиша не имеет сканкода, либо сканкод не сопоставлен с keycode, или какой-то другой процесс перехватывает нажатие клавиши. Если вы подозреваете, что процесс, прослушивающий X-сервер, перехватывает нажатие клавиши, вы можете попробовать запустить xev из чистого X-сеанса:

Константа для ключа Microsoft Windows "Windows". Он используется как для левой, так и для правой версии ключа.

CONTEXT_MENU

ФИНАЛ

КОНВЕРТИРОВАТЬ

НЕ КОНВЕРТИРОВАТЬ

ПРИНЯТЬ

ИЗМЕНЕНИЕ РЕЖИМА

КАНДЗИ

БУКВЫ

КАТАКАНА

ХИРАГАНА

ПОЛНАЯ_ШИРИНА

HALF_WIDTH

ROMAN_CHARACTERS

ВСЕ_КАНДИДАТЫ

ПРЕДЫДУЩИЙ_КАНДИДАТ

CODE_INPUT

ЯПОНСКАЯ_КАТАКАНА

Константа для функциональной клавиши японского языка катакана. Эта клавиша переключает метод ввода на японский язык и выбирает режим ввода катакана.

ЯПОНСКАЯ_ХИРАГАНА

Константа для функциональной клавиши японского языка хирагана. Эта клавиша переключает метод ввода на японский язык и выбирает режим ввода хираганы.

ЯПОНСКИЙ_РИМСКИЙ

Константа для японско-римской функциональной клавиши. Эта клавиша переключает метод ввода на японский язык и выбирает режим ввода Roman-Direct.

КАНА_БЛОКИРОВКА

INPUT_METHOD_ON_OFF

ВСТАВИТЬ

ЕЩЕ РАЗ

РЕПОРТАЖ

СОСТАВИТЬ

ALT_GRAPH

НАЧАТЬ

НЕ ОПРЕДЕЛЕН

Это значение используется для указания того, что keyCode неизвестен. События с типизированным ключом не имеют значения keyCode; вместо этого используется это значение.

ПРОГРАММА_0

ПРОГРАММА_1

ПРОГРАММНАЯ КЛАВИША_2

ПРОГРАММА_3

ПРОГРАММА_4

ПРОГРАММА_5

ПРОГРАММА_6

ПРОГРАММА_7

ПРОГРАММА_8

ПРОГРАММА_9

ИГРА_А

ИГРА_B

GAME_C

ИГРА_D

ФУНТ

СИЛА

COLORED_KEY_0

COLORED_KEY_1

COLORED_KEY_2

COLORED_KEY_3

EJECT_TOGGLE

ЗАПИСЬ

FAST_FWD

НАЗАД

TRACK_PREV

TRACK_NEXT

КАНАЛ_ВВЕРХ

КАНАЛ_ВНИЗ

VOLUME_UP

VOLUME_DOWN

КОМАНДА

ЯРЛЫК

Сведения о методе

значения

Возвращает массив, содержащий константы этого типа перечисления, в порядке их объявления. Этот метод можно использовать для перебора констант следующим образом:

значение

Возвращает константу перечисления этого типа с указанным именем. Строка должна точно совпадать с идентификатором, используемым для объявления константы перечисления в этом типе. (Недопустимы лишние пробельные символы.)

Я пытаюсь использовать xmodmap для переназначения клавиш Alt/Super на клавиатуре Dell L100, но не могу получить коды клавиш.

Например, использование xev не дает мне код клавиши для Alt

Для правого суперключа xev и showkey дают разные коды клавиш — 134 и 126 соответственно.

Что происходит с этими кодами клавиш?

Я попытался получить коды клавиш с помощью showkey -k и использовать файл xmodmap ниже, но это дало странную карту, которая переназначала ключ b:

У меня та же проблема: Alt_L не срабатывает (но с Alt_R все в порядке) на XUbuntu 14.04. Какую систему вы используете?

У меня 5-рядная клавиатура (60-процентная клавиатура) с левой и правой клавишами Alt и клавишей Win (супер). Клавиши Alt меняются местами с клавишами Win. Я предполагаю, что это обычная проблема для «60-процентных клавиатур», которые популярны среди тех, кто любит все время держать пальцы на Home Row (я, для использования Vim), а также популярны среди геймеров. Должна быть общая раскладка клавиатуры с 5 рядами, входящая в состав дистрибутивов Linux.

6 ответов 6

Между вашей клавиатурой и процессом, обрабатывающим событие клавиатуры, находится множество игроков. Среди основных элементов ландшафта тот факт, что система X имеет свой собственный уровень обработки клавиатуры, и X связывает с клавишами другие «коды клавиш», чем ваша базовая система Linux. Команда showkey показывает вам коды клавиш на жаргоне базовой системы Linux. Для xmodmap вам нужны коды клавиш X, которые отображает xev. Пока вы планируете работать в X и выполнять перепривязку ключей с помощью xmodmap , игнорируйте showkeys и просто слушайте, что говорит xev.

Что вы хотите найти в выводе xev, так это блоки, подобные этому:

xev имеет тенденцию генерировать много вывода, особенно когда вы двигаете мышью. Возможно, вам придется прокрутить страницу назад, чтобы найти нужный результат. В предыдущем выводе мы видим, что символ клавиши Alt_L связан с кодом клавиши X 64 .

Проблема в том, что я не получаю событие KeyPress для клавиши Windows. Я пробовал 3 разные клавиатуры и тот же результат. От xev я получаю только FocusOut, FocusIn и KeymapNotify, как показано выше. Однако я могу пойти и настроить ярлыки через диспетчер Gnome, и он видит ключ Windows как «Mod4»

Правая клавиша Windows отображается как Mod4, левая клавиша Windows сообщается как Alt. что сбивает с толку, потому что у меня даже нет категории «Alt» в моем xmodmap.

@YaroslavBulatov звучит так, будто среда вашего рабочего стола съедает ключ (возможно, чтобы вызвать его главное меню?)

Вы можете фильтровать события, которые дает вам xev. В этом случае xev -event keyboard будет достаточно, чтобы избавиться от большей части шума.

Вот более лаконичный фильтр: xev | grep -A 6 Нажатие клавиши . Это напечатает только 6 строк после сопоставления для события KeyPress.

xev должен работать

Странно, мой xev выдает события KeyPress и KeyRelease для alt (и для клавиши Windows, здесь называемой "super"):

И правый:

Я вижу две возможности:

  1. Что-то еще полностью поглощает нажатия клавиш или расфокусирует окно при нажатии клавиши Alt. Попробуйте запустить xev на пустом X-сервере (например, просто запустите xinit -- :1 , что должно дать вам X-сервер только с xterm — там даже не будет работать оконный менеджер. Выход из xterm закроет сеанс. ).
  2. Вы только что пропустили два события в массиве, который извергает xev.

Легкий способ, если вы знаете имя ключа

Другая возможность: просто получить коды клавиш из xmodmap:

Снова 64 и 108. xmodmap -pm покажет вам только карту модификаторов, которая также дает вам числа (правда, на этот раз в шестнадцатеричном формате).

Я "обнаружил" в вашем вопросе три проблемы:

  1. Почему xev и showkey сообщают разные коды клавиш для ключа?
  2. Почему xev не показывает правильное нажатие клавиши Alt?
  3. Как поменять местами Alt и Win?

Относительно первого вопроса: в наши дни, когда «драйвер» клавиатуры в X на самом деле не управляет аппаратным обеспечением, он может просто передавать коды клавиш из ядра в ядро ​​X, но это не так. Он добавляет 8 к коду клавиши перед передачей.

Во-вторых, что-то в вашем сеансе X захватывает событие Alt. Другие ответы уже охватывают это. (То есть xev не получает событие, которое вы хотели бы видеть). Виновник может быть связан с вашим оконным менеджером. Попробуйте более голую X-сессию.

Третье: не используйте xmodmap . Он устарел на десятилетие. Новые ребята — это XKB и его инструмент setxkbmap .

Для замены Alt и Win в XKB уже подготовлена ​​опция. Просто добавьте это:

<р>. чтобы узнать, что такое скан-код для вашего таинственного ключа. У меня получилось что-то вроде этого:

Не знаю, почему получается, что одна клавиша генерирует два скан-кода. Насколько я мог судить по шаблону, это не просто нажатие клавиши/нажатие клавиши. Обратите внимание на предупреждение, так что вы можете запустить это в однопользовательском режиме.

Я предположил, что 0x46 был моим скан-кодом.

Далее найдите неиспользуемый код клавиши с помощью:

Здесь вы можете видеть, что код 97 не используется в моей системе:

Код клавиши, который использует X, и код клавиши, который использует ядро, имеют значение OFF BY 8 по «историческим причинам». Так что возьмите 97 - 8 = 89 и используйте 89 с командой setkeycodes (опять же как root):

И вы должны быть настроены. Подтвердите с помощью xev, что вы получаете событие нажатия клавиши с кодом клавиши 97. (хотя как только я сказал файлу ключей Fluxbox использовать этот код клавиши, я больше не получал события KeyPress — может быть, потому, что Fluxbox проглатывает их, когда использует?)

Обратите внимание, что setkeycodes не сохраняется после перезагрузки, поэтому вам придется добавить его в сценарии инициализации (например, в /etc/rc.local)

Я использовал ваш ответ, чтобы сопоставить заглавные буквы с функциональной клавишей (в частности, F9). Это позволяет мне использовать F9 в качестве префикса в tmux. Спасибо.

@RobertSiemer tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html «Часто число X будет на 8 больше, чем число Linux». Моя формулировка «исторический», должно быть, взята с другой справочной страницы.

У меня есть ключ, для которого xev сообщает код ключа 93, sudo showkey сообщает 85, а sudo showkey -s сообщает 0x76 0xf6, поэтому я попробовал sudo setkeycodes с 0x76 , 0xf6 , 76 или 85 в качестве кода сканирования и 89 в качестве кода ключа, но ничего не изменилось. , xev по-прежнему сообщает 93!

Я пытался решить эту проблему для себя, и я только что понял это.

Основная проблема заключается в том, что вы не получаете событие для нажатия клавиши. Глядя на журнал, который вы опубликовали, причина очевидна.

Вы можете видеть, что события Focus имеют режим Notify . Это указывает на то, что клавиша была обработана другим процессом (вероятно, приложением быстрого доступа или привязки клавиш).

В моем случае это был xbindkeys, но если вы используете среду рабочего стола, у них, вероятно, есть система привязки клавиш. Чтобы увидеть эти события, вам нужно будет остановить/отключить другую программу.

Если вы не можете определить, какая программа крадет ключевые события, лучшим решением будет запустить еще один X-сеанс без его запуска. Выполните следующую команду, чтобы запустить еще один X-сеанс на дисплее: 1, если он уже занят, просто увеличьте число в конце. Конечно, вы можете изменить терминал на любой, который вы предпочитаете или который установлен в вашей системе.

Затем снова запустите xev. Это должно дать вам результат без захвата другими программами. Обратите внимание, что оконный менеджер, который запускается, работает с фокусом наведения, поэтому вам придется поместить курсор над окном xev, чтобы клавиши были захвачены.

Как было сказано в этом превосходном ответе dubiousjim, ключевой код отличается, потому что между xev и ядром есть много слоев.

Читайте также: