Я думаю, что был бы способ сделать это. Дело в том, что вам придется читать прямо с клавиатуры устройства. Вы не будете получать вход от терминала. У меня та же проблема. У меня есть программа, которая работает (в фоновом режиме), и я хочу знать, удерживает ли пользователь клавишу Shift.
Я полагаю, что это возможно, и можно начать с /dev/input/by-path/*-kbd
.
Этот файл дает ввод каждый раз, когда нажимается или повторяется нажатие клавиши, если он удерживается, поэтому его стоит посмотреть. (Попробуйте кошку /dev/input/by-path/*-kbd
)
Если вы поймете это, я хотел бы услышать, как вы это сделали.
РЕДАКТИРОВАТЬ: Я нашел решение
Я понял, как это сделать. Моя программа выглядит следующим образом:
#include <stdlib.h>
#include <stdio.h>
#include <linux/input.h>
void usage ( int argc, char *argv[] )
{
printf("Usage:\n\t%s key\n\nvalid keys are:\n\tlshift\t- Left Shift key\n" , argv[0]);
exit(EXIT_FAILURE);
}
int main ( int argc, char *argv[], char *env[] )
{
if ( argc != 2 ) usage(argc, argv);
int key;
if ( strcmp(argv[1], "lshift") == 0 ) key = KEY_LEFTSHIFT;
else if ( strcmp(argv[1], "rshift") == 0 ) key = KEY_RIGHTSHIFT;
else if ( strcmp(argv[1], "lalt") == 0 ) key = KEY_LEFTALT;
else if ( strcmp(argv[1], "ralt") == 0 ) key = KEY_RIGHTALT;
else if ( strcmp(argv[1], "lctrl") == 0 ) key = KEY_LEFTCTRL;
else if ( strcmp(argv[1], "rctrl") == 0 ) key = KEY_RIGHTCTRL;
FILE *kbd = fopen("/dev/input/by-path/platform-i8042-serio-0-event-kbd", "r");
char key_map[KEY_MAX/8 + 1]; // Create a byte array the size of the number of keys
memset(key_map, 0, sizeof(key_map)); // Initate the array to zero's
ioctl(fileno(kbd), EVIOCGKEY(sizeof(key_map)), key_map); // Fill the keymap with the current keyboard state
int keyb = key_map[key/8]; // The key we want (and the seven others arround it)
int mask = 1 << (key % 8); // Put a one in the same column as out key state will be in;
return !(keyb & mask); // Returns true if pressed otherwise false
}
Отсутствует информационное сообщение (я слишком ленив). Но по сути первый аргумент сравнивается со списком ключей и используется соответствующий идентификатор ключа. Возвращает true, если клавиша нажата, и false, если нет.
Обратите внимание
Вам нужно будет изменить название устройства клавиатуры. Я не знаю, как найти устройство клавиатуры по умолчанию. (если вы знаете, я хотел бы услышать;))
Это прекрасно работает: я использую его для запуска автозапуска Xorg, если удерживаю клавишу Shift.