Поддельный код клавиши для переназначенных клавиш клавиатуры

Я перепутал свой замок с блокировкой в ​​backspace.

/ etc / default / keyboard

XKBLAYOUT="us" XKBVARIANT="altgr-intl" BACKSPACE="guess" XKBOPTIONS="caps:backspace"

Это работает очень хорошо, за исключением того, что он не работает для некоторых конкретных инструменты. Я использовал xev, чтобы узнать, что происходит.

Backspace нажата

KeyPress event, serial 38, synthetic NO, window 0x2400001, root 0x159, subw 0x0, time 1028211, (335,635), root:(452,749), state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES, XLookupString gives 1 bytes: (08) " XmbLookupString gives 1 bytes: (08) " XFilterEvent returns: False KeyRelease event, serial 38, synthetic NO, window 0x2400001, root 0x159, subw 0x0, time 1028272, (335,635), root:(452,749), state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES, XLookupString gives 1 bytes: (08) " XFilterEvent returns: False

Caps lock нажата

KeyPress event, serial 38, synthetic NO, window 0x2400001, root 0x159, subw 0x0, time 859789, (391,558), root:(508,672), state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES, XKeysymToKeycode returns keycode: 22 XLookupString gives 1 bytes: (08) " XmbLookupString gives 1 bytes: (08) " XFilterEvent returns: False KeyRelease event, serial 38, synthetic NO, window 0x2400001, root 0x159, subw 0x0, time 859875, (391,558), root:(508,672), state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES, XKeysymToKeycode returns keycode: 22 XLookupString gives 1 bytes: (08) " XFilterEvent returns: False

Я также пробовал это в браузера с помощью

addEventListener('keyup', event => { console.log(event.keyCode, event.key, event.code) })

При нажатии на кнопку backspace и caps lock

8 "Backspace" "Backspace" 8 "Backspace" "CapsLock"

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

Возможно ли сопоставить блокировку шапки таким образом, чтобы она полностью эмулировала обратное пространство вместо того, чтобы действовать как перепутана крышка замка?

1
задан 26 March 2018 в 22:32

3 ответа

во-первых, давайте посмотрим, как клавиши обрабатывается (взято из ответа):

/клавиатуры/ → [ф9] → /водитель/ → [ф10] → /x-сервер ХКВ/ → [ф11]

в [ф12] - это специальный код устройства, который привязан к определенном ключе, и может различаться в зависимости от поставщиков/продуктов. [от f13] и [ф14] распространяются на приложения. В [ф15] служит слоем абстракции, как это устройство агностик и язык агностик. То же [ф16] может произвести различные [f17 В]С, В зависимости от локали и состояние клавиш-модификаторов. Это причина, почему некоторые приложения только искать [ф18], особенно при общении с помощью сочетаний клавиш.

так что наша цель-сопоставить [зг19] ваши клавиши capslock на [ф20] на клавишу backspace. Приложения, то увидите то же [клавиши f21] и [ф22] независимо от того, нажимаешь backspace и клавишу capslock.

это сопоставление производится по ответ, используя файл hardwaredatabase (hwdb.бин), который составлен из .hwdb файлов в обоих [ф23] и [ф24].

Как изменить [f25 привод датчика]->[ф26] отображение

собрать необходимую информацию

сначала вы должны определить bustype, [ф28], [f29 и f30 С] из устройства ввода (клавиатуры), а также [ф31] в клавишу, которую хотите переназначить и [f32 из] вы хотите отобразить его.

Запустите evtest (возможно, вам придется установить его) и определить вашу клавиатуру в списке устройств. На клавиатуры с дополнительными клавишами, как воспроизведение/пауза, www и т. д. эти ключи часто подвергаются как различные устройства ввода. Если Вы не получаете никаких выходных данных при нажатии клавиши, нажмите Control+C и попробовать другое устройство. После того как вы определили вашу клавиатуру, помню первый столбец (/dev/input/eventX) и нажмите клавишу, которую хотите переназначить. Значение после [ф35] это [f36 в]. На моей клавиатуре:

[Ф1]

... в [фунции f37] это ч.

теперь выполните следующую команду, где eventX это тот, который вы выбрали раньше:

[Ф2]

выход для моей клавиатуры

[Ф3]

, чтобы получить [f39 расстройства], либо использовать выход [ф40] или посмотри в разделе ключи и кнопки [ф41] для полного списка. Идентификатор часть после KEY_ в Нижнем регистре, например, KEY_BACKSPACE будет возврата.

Настройка udev для

посмотри [пулемет f44]. Мы создадим текстовый файл в пробел с именем, начинающимся с числа, большего, чем файл, соответствующий нашему типу устройства. Для клавиатуры, это может быть любое число больше 60, а на джойстик она должна быть больше, чем 70. Например 65-keyboard-custom.hwdb. Используйте ваш любимый текстовый редактор, но имейте в виду, что вы должны запустить его как root, например,

[Ф4]

Добавить следующее содержание

[ф5]

...где

[bustype], [продавец], [продукт] и [версия] у нас ровно 4 знака (колодка с нулями, если это необходимо) и буквы должны быть ПРОПИСНЫМИ [скан] не нужна прокладка, но буквы должны быть строчные evdev:... линия не имеет предшествующих пространства KEYBOARD_KEY... линия имеет только один предыдущий пространства

в моем примере, этот файл выглядит так:

[ф6] [и D40]в первой строке будет соответствовать вашим устройством. Вы можете указать дополнительные [ф50] линии, и вы можете использовать более чем один шаблон (*), чтобы соответствовать дополнительных устройств, но имейте в виду, что scancodes не конкретного устройства. Вы также можете добавить более одного сопоставления скан. Посмотрите на /lib/udev/hwdb.d/60-keyboard.hwdb для вдохновения. Более подробную и актуальную версию этого файла можно найти в онлайн-хранилище.[!и D40]

применить новую конфигурацию

[d43 см.]Скомпилируйте новую конфигурацию аппаратной базы данных:[!d43 см.] [ф7]

если вы хотите применить изменения немедленно, сообщить в udev:

[ф8]

обратите внимание, что значения конфигурации могут быть добавлены или изменены во время работы системы. При удалении конфигурации (например, скан карты), вы должны перезагрузить, чтобы изменения вступили в силу.

не забудьте также отменить переназначение вы делали раньше (используя /etc/default/keyboard), потому что все-таки будет применяться для всех клавиатур.

1
ответ дан 8 June 2018 в 15:16
  • 1
    Я получаю следующее значение из [Ф1] [Ф2]. Поскольку это не соответствует формат, который Вы описали, я заменил код продукта с шаблоном. Наверное, это не очень хорошая идея, но я не могу показаться, чтобы это исправить. (Это может быть проблемой для будущего.) В любом случае, это работает! Спасибо! – Remco Haszing 27 March 2018 в 17:08
  • 2
    Почему ваш вывод не соответствует формату я описал? автобус 11, поставщик 1, продукт 1. Кажется, универсальный PS/2 клавиатура. Вы также можете посмотреть в начале [Ф1], где эти строки соответствуют описаны далее. – danzel 27 March 2018 в 18:38
  • 3
    @Ремко Haszing спасибо за ваши отзывы, я нашел более удобный способ получения этих значений. Я также Добавлена информация об удалении скан сопоставления (вступает в силу только после перезагрузки), я надеюсь (для вашего будущего), что была проблема с которой вы столкнулись. – danzel 28 March 2018 в 15:54

Сначала давайте посмотрим, как обрабатывается нажатие клавиши (взято из этого ответа):

/ keyboard / & rarr; scancode & rarr; / драйвер ввода / & rarr; keycode & rarr; / X сервер XKB / & rarr; keysym

scancode - это код, специфичный для устройства, привязанный к определенному ключу и отличающийся от разных поставщиков / продуктов. keycode и keysym распространяются на приложения. [F15] служит слоем абстракции, поскольку он агностик и агрегирован. Тот же keycode может создавать разные keysym s, в зависимости от языка и состояния клавиш-модификаторов. Вот почему некоторые приложения ищут только keycode, особенно при работе с быстрыми клавишами.

Итак, наша цель - сопоставить scancode вашего ключа CapsLock с keycode BackSpace. Приложения будут видеть те же keycode и keysym, независимо от того, нажимаете ли вы BackSpace или CapsLock.

Это сопоставление выполняется с помощью этого ответа с использованием файла базы данных оборудования (hwdb.bin ), который скомпилирован из файлов .hwdb как в /lib/udev/hwdb.d/, так и в /etc/udev/hwdb.d/.

Как изменить scancode -> keycode отображение

Соберите требуемую информацию

Сначала вы должны определить bustype, vendor, product и version вашего устройства ввода (клавиатура), а также scancode клавиши вы хотите переназначить и key code identifier, на который вы хотите сопоставить его.

Запустите evtest (возможно, вам придется сначала установить его) и определить свою клавиатуру в списке устройств. На клавиатурах с дополнительными клавишами, такими как Play / Pause, WWW и т. Д., Эти клавиши часто отображаются как другое устройство ввода. Если вы не получаете какой-либо вывод при нажатии клавиши, нажмите Control + C и попробуйте другое устройство. После того, как вы определили свою клавиатуру, запомните первый столбец (/dev/input/eventX) и нажмите клавишу, которую вы хотите переназначить. Значение после (MSC_SCAN) равно scancode. На моей клавиатуре:

$ evtest Available devices: /dev/input/event0: Power Button /dev/input/event1: Power Button /dev/input/event2: G19 Gaming Keyboard /dev/input/event3: G19 Gaming Keyboard ... Select the device event number [0-18]:2 ... Event: time 1522111203.117945, -------------- SYN_REPORT ------------ Event: time 1522111220.778787, type 4 (EV_MSC), code 4 (MSC_SCAN),value 70039 Event: time 1522111220.778787, type 1 (EV_KEY), code 14 (KEY_BACKSPACE), value 1

... scancode - h .

Теперь запустите следующую команду, где eventX тот, который вы выбрали раньше:

$ grep "" /sys/class/input/eventX/device/id/*

Выход для моей клавиатуры:

/sys/class/input/event2/device/id/bustype:0003 /sys/class/input/event2/device/id/product:c228 /sys/class/input/event2/device/id/vendor:046d /sys/class/input/event2/device/id/version:0110

Чтобы получить key code identifier, либо используйте вывод evtest, либо посмотрите на Раздел «Ключи и кнопки» в /usr/include/linux/input-event-codes.h для полного списка. Идентификатором является часть после KEY_, преобразованная в нижний регистр, например. KEY_BACKSPACE становится обратным пространством.

Настроить udev

Взгляните на /lib/udev/hwdb.d/. Мы создадим текстовый файл в backspace с именем файла, начинающимся с числа, большего, чем файл, соответствующий нашему типу устройства. Для клавиатуры это может быть любое число больше 60, тогда как для указательной ручки оно должно быть больше 70. Например 65-keyboard-custom.hwdb. Используйте свой любимый текстовый редактор, но имейте в виду, что вы должны запустить его как root, например

$ sudo gedit /etc/udev/hwdb.d/65-keyboard-custom.hwdb

Добавить следующий контент

evdev:input:b[bustype]v[vendor]p[product]e[version]* KEYBOARD_KEY_[scancode]=[key code identifier]

... где

[bustype], [vendor], [product] и [version] имеют ровно 4 символа (с нулями при необходимости), а буквы должны быть в верхнем регистре [scancode] не требуется прокладка, но письма должны в строке evdev:... нет предыдущего пробела, строка KEYBOARD_KEY... имеет ровно одно предыдущее пространство

В моем примере файл выглядит так:

evdev:input:b0003v046DpC228e0110* KEYBOARD_KEY_70039=backspace # map CapsLock to BackSpace

Первый линия будет соответствовать вашему устройству. Вы можете указать дополнительные evdev: строки, и вы можете использовать более одного шаблона (*) для соответствия дополнительным устройствам, но имейте в виду, что scancodes являются специфичными для устройства. Вы также можете добавить несколько снимков сканкода. Взгляните на /lib/udev/hwdb.d/60-keyboard.hwdb для вдохновения.

Применить новую конфигурацию

Скомпилировать новую конфигурацию в базу данных аппаратного обеспечения:

$ sudo systemd-hwdb update

Если вы хотите немедленно применить изменения, сообщите udev:

$ sudo udevadm trigger

Обратите внимание, что значения конфигурации могут быть добавлены или изменены только во время работы системы.

Не забудьте также отменить переназначение, которое вы делали раньше (используя /etc/default/keyboard), потому что это все равно применяется ко всем клавиатурам.

2
ответ дан 17 July 2018 в 18:05

Сначала давайте посмотрим, как обрабатывается нажатие клавиши (взято из этого ответа):

/ keyboard / & rarr; scancode & rarr; / драйвер ввода / & rarr; keycode & rarr; / X сервер XKB / & rarr; keysym

scancode - это код, специфичный для устройства, привязанный к определенному ключу и отличающийся от разных поставщиков / продуктов. keycode и keysym распространяются на приложения. [F15] служит слоем абстракции, поскольку он агностик и агрегирован. Тот же keycode может создавать разные keysym s, в зависимости от языка и состояния клавиш-модификаторов. Вот почему некоторые приложения ищут только keycode, особенно при работе с быстрыми клавишами.

Итак, наша цель - сопоставить scancode вашего ключа CapsLock с keycode BackSpace. Приложения будут видеть те же keycode и keysym, независимо от того, нажимаете ли вы BackSpace или CapsLock.

Это сопоставление выполняется с помощью этого ответа с использованием файла базы данных оборудования (hwdb.bin ), который скомпилирован из файлов .hwdb как в /lib/udev/hwdb.d/, так и в /etc/udev/hwdb.d/.

Как изменить scancode -> keycode отображение

Соберите требуемую информацию

Сначала вы должны определить bustype, vendor, product и version вашего устройства ввода (клавиатура), а также scancode клавиши вы хотите переназначить и key code identifier, на который вы хотите сопоставить его.

Запустите evtest (возможно, вам придется сначала установить его) и определить свою клавиатуру в списке устройств. На клавиатурах с дополнительными клавишами, такими как Play / Pause, WWW и т. Д., Эти клавиши часто отображаются как другое устройство ввода. Если вы не получаете какой-либо вывод при нажатии клавиши, нажмите Control + C и попробуйте другое устройство. После того, как вы определили свою клавиатуру, запомните первый столбец (/dev/input/eventX) и нажмите клавишу, которую вы хотите переназначить. Значение после (MSC_SCAN) равно scancode. На моей клавиатуре:

$ evtest Available devices: /dev/input/event0: Power Button /dev/input/event1: Power Button /dev/input/event2: G19 Gaming Keyboard /dev/input/event3: G19 Gaming Keyboard ... Select the device event number [0-18]:2 ... Event: time 1522111203.117945, -------------- SYN_REPORT ------------ Event: time 1522111220.778787, type 4 (EV_MSC), code 4 (MSC_SCAN),value 70039 Event: time 1522111220.778787, type 1 (EV_KEY), code 14 (KEY_BACKSPACE), value 1

... scancode - h .

Теперь запустите следующую команду, где eventX тот, который вы выбрали раньше:

$ grep "" /sys/class/input/eventX/device/id/*

Выход для моей клавиатуры:

/sys/class/input/event2/device/id/bustype:0003 /sys/class/input/event2/device/id/product:c228 /sys/class/input/event2/device/id/vendor:046d /sys/class/input/event2/device/id/version:0110

Чтобы получить key code identifier, либо используйте вывод evtest, либо посмотрите на Раздел «Ключи и кнопки» в /usr/include/linux/input-event-codes.h для полного списка. Идентификатором является часть после KEY_, преобразованная в нижний регистр, например. KEY_BACKSPACE становится обратным пространством.

Настроить udev

Взгляните на /lib/udev/hwdb.d/. Мы создадим текстовый файл в backspace с именем файла, начинающимся с числа, большего, чем файл, соответствующий нашему типу устройства. Для клавиатуры это может быть любое число больше 60, тогда как для указательной ручки оно должно быть больше 70. Например 65-keyboard-custom.hwdb. Используйте свой любимый текстовый редактор, но имейте в виду, что вы должны запустить его как root, например

$ sudo gedit /etc/udev/hwdb.d/65-keyboard-custom.hwdb

Добавить следующий контент

evdev:input:b[bustype]v[vendor]p[product]e[version]* KEYBOARD_KEY_[scancode]=[key code identifier]

... где

[bustype], [vendor], [product] и [version] имеют ровно 4 символа (с нулями при необходимости), а буквы должны быть в верхнем регистре [scancode] не требуется прокладка, но письма должны в нижней строке evdev:... нет предыдущего пробела, строка KEYBOARD_KEY... имеет ровно одно предыдущее пространство

В моем примере файл выглядит следующим образом:

evdev:input:b0003v046DpC228e0110* KEYBOARD_KEY_70039=backspace # map CapsLock to BackSpace

Первый линия будет соответствовать вашему устройству. Вы можете указать дополнительные evdev: строки, и вы можете использовать более одного шаблона (*) для соответствия дополнительным устройствам, но имейте в виду, что scancodes являются специфичными для устройства. Вы также можете добавить несколько снимков сканкода. Взгляните на /lib/udev/hwdb.d/60-keyboard.hwdb для вдохновения.

Применить новую конфигурацию

Скомпилировать новую конфигурацию в базу данных аппаратного обеспечения:

$ sudo systemd-hwdb update

Если вы хотите немедленно применить изменения, сообщите udev:

$ sudo udevadm trigger

Обратите внимание, что значения конфигурации могут быть добавлены или изменены только во время работы системы.

Не забудьте также отменить переназначение, которое вы делали раньше (используя /etc/default/keyboard), потому что это все равно применяется ко всем клавиатурам.

2
ответ дан 23 July 2018 в 18:55

Другие вопросы по тегам:

Похожие вопросы: