Я хочу написать приложение на Python, которое вы можете использовать с клавиатурой по умолчанию и специально разработанное для этого приложения. Я разработаю его, просто используя небольшую цифровую клавиатуру с наклейками, чтобы назначать действия различным клавишам. Обе клавиатуры будут подключены через USB.
Однако, когда эти клавиши нажаты, только их обычные сигналы (номера, операторы и вводы) будут отправлены на Python, и он не сможет различить сигналы от основной клавиатуры и специальной клавиатуры.
Поскольку у Python (насколько я мог найти) нет способа сделать это различие, я хочу сделать это на самой ОС. Я буду программировать его для Raspberry Pi, так что это будет Linux.
Итак, главный вопрос: как мне переназначить клавиши определенной клавиатуры на другие коды клавиш. Я думал об использовании F-клавиш, которые я не буду использовать для других целей; или просто некоторые символы, которых нет ни на одной клавиатуре (предположим, что они есть).
Возможно ли это в Linux / Unix? И если так, как я могу это сделать?
Ответы:
Если вы используете Linux, лучший способ различить устройства ввода - это использовать интерфейс событий Linux . После того, как аппаратный ввод устройства декодируется, он преобразуется в промежуточную специфичную для Linux структуру событий и становится доступной, читая одно или несколько символьных устройств в разделе
/dev/input/
. Кстати, это совершенно не зависит от языка программирования, который вы используете.Каждое аппаратное устройство получает свое собственное
/dev/input/eventX
устройство, и есть также агрегаты (например,/dev/input/mice
которые представляют движение всех мышей в системе). Ваша система также может иметь/dev/input/by-path
и/dev/input/by-id
.Есть
ioctl
вызываемый,EVIOCGNAME
который возвращает имя устройства в виде удобочитаемой строки, или вы можете использовать что-то подобное/dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse
.Вы открываете устройство, и каждый раз, когда поступает событие от устройства ввода, вы получаете пакет данных. Если вы можете читать C, вы можете изучить файл,
/usr/include/linux/input.h
который показывает, как именно это работает. Если вы этого не сделаете, вы можете прочитать этот вопрос, который предоставляет всю необходимую информацию.Преимущество интерфейса событий заключается в том, что вы просто узнаете, какое устройство вам нужно, и можете читать входные данные только с этого устройства ввода , игнорируя все остальные. Вы также будете получать уведомления о клавишах, кнопках и элементах управления, которые вы обычно не получаете, просто читая «обработанный» поток символов из терминала: даже мертвые клавиши, как Shift, и т. Д.
Плохо то, что интерфейс событий не возвращает «приготовленные» символы, он просто использует числовые коды для ключей (коды, соответствующие каждому ключу, находятся в вышеупомянутом заголовочном файле - но также в Python-источнике event.py . Если ваше устройство ввода имеет необычные клавиши / кнопки, вам может потребоваться немного поэкспериментировать, пока вы не получите правильные цифры.
источник
Альтернативный подход (если ваша «клавиатура» не имеет много клавиш - многие устройства претендуют на то, чтобы быть клавиатурами) - это применить сопоставление клавиш для каждой клавиатуры специально и убедиться, что клавиши различаются.
Это изложено здесь: /superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only . Основным моментом является
setxkbmap
аргумент устройства.Если вы используете подход необработанного ввода, lsinput найдет ваше необработанное устройство для вас.
источник