Доступ к ключам с устройства ввода Linux
Итак, я пытался получить доступ к вводу с клавиатуры в Linux. В частности, мне нужно иметь доступ к нажатию клавиш-модификаторовбез другие клавиши нажаты. Кроме того, я хочу быть в состоянии сделать этобез система X работает.
Итак, вкратце, мои требования таковы:
Работает на LinuxНе нужен X11Может получить модификатор нажатием клавишибез любые другие нажимаемые клавишиЭто включает в себя следующие ключи:сдвигконтрольAltВсе, что мне нужно, это просто,0 = not pressed
1 = currently pressed
сообщить мне, удерживается ли клавиша при проверке клавиатурыНастройка моего компьютераМоя обычная машина с Linux находится на грузовике в направлении моей новой квартиры; Итак, у меня есть только Macbook Air для работы прямо сейчас. Поэтому я запускаю Linux на виртуальной машине, чтобы проверить это.
Виртуальная машина в VirtualBox
ОС: Linux Mint 16Окружение рабочего стола: XFCEВсе ниже было сделано в этой среде. Я'Я пробовал и с запущенным X, и с одним из других ttys.
Мои мыслиЯ изменю это, если кто-то может поправить меня.
Мы довольно много читали, чтобы понять, что библиотеки более высокого уровня не предоставляют такую функциональность. Клавиши-модификаторы используются с другими клавишами для предоставления альтернативного кода клавиши. Доступ к самим ключам модификаторов через высокоуровневую библиотеку в LinuxЭто так просто. Или, скорее, я неЯ нашел высокоуровневый API для этого в Linux.
я думалlibtermkey будет ответом, но это не такКажется, он поддерживает клавишу-модификатор Shift лучше, чем обычное нажатие клавиши. Я'Я также не уверен, работает ли он без X.
Во время работы с libtermkey (прежде чем я понял, что это неЧтобы получить сдвиг в таких случаях, как Shift-Return), я планировал написать демон, который будет запускаться для сбора событий клавиатуры. Запуск копий программы-демона будет просто передавать запросы на данные клавиатуры и получать данные клавиатуры в ответ. Я мог бы использовать эту настройку, чтобы что-то всегда работало в фоновом режиме, в случае, если я не могу проверить статусы кода ключа в определенное время (должен быть получен код ключа в том виде, как он происходит).
Ниже приведены две мои попытки написать программу, которая может читать с клавиатуры устройства Linux. Я'Мы также включили мой маленький чек, чтобы убедиться, что у меня подходящее устройство.
Попытка № 1Я попытался получить доступ к устройству клавиатуры напрямую, но у меня возникли проблемы. Я попробовал предложениеВот это находится в другом потоке переполнения стека. Это дало мне ошибку сегментации; Итак, я изменил его с fopen, чтобы открыть:
// ...
int fd;
fd = open("/dev/input/by-path/platform-i8042-serio-0-event-kbd", O_RDONLY);
char key_map[KEY_MAX/8 + 1];
memset(key_map, 0, sizeof(key_map));
ioctl(fd, EVIOCGKEY(sizeof key_map), key_map);
// ...
В то время как не было ошибки сегментации, не было никакого индикатора любого нажатия клавиши (не только клавиши модификатора). Я проверил это с помощью: я
./foo && echo "TRUE" || echo "FALSE"
мы использовали это для проверки успешных кодов возврата команд; так что я знаю этохорошо. Я'Мы также вывели ключ (всегда 0) и маску (0100) для проверки. Это просто некажется, ничего не обнаружил.
Попытка № 2Отсюда я думал, чтоЯ попробую немного другой подход. Я хотел выяснить, что я делаю неправильно. Следующийэтот На странице с фрагментом, демонстрирующим распечатку кодов ключей, я включил это в программу:
#include
#include
#include
#include
#include
int main(int argc, char** argv) {
uint8_t keys[128];
int fd;
fd = open("/dev/input/by-path/platform-i8042-serio-event-kbd", O_RDONLY);
for (;;) {
memset(keys, 0, 128);
ioctl (fd, EVIOCGKEY(sizeof keys), keys);
int i, j;
for (i = 0; i < sizeof keys; i++)
for (j = 0; j < 8; j++)
if (keys[i] & (1 < j))
printf ("key code %d\n", (i*8) + j);
}
return 0;
}