Linux - Есть ли способ получить глобальные KeyPress без записи xlib? (DBus/HAL/ и т.д.?)
Я смотрел на то, как захватить глобальные кепрессы на Ubuntu Linux независимо от того, какое окно имеет фокус. И люди предложили посмотреть некоторые программы. Но все они используют функцию записи в XLib, которая не работает в Ubuntu. Есть ли какой-нибудь другой способ перехватить все нажатия клавиш в Ubuntu? Как насчет использования HAL? DBus?
1 ответ
Вы можете открыть /dev/input/eventN
устройство, соответствующее клавиатуре (ам) и считывание событий клавиатуры оттуда. Вы даже получите события клавиатуры от не-X консолей. Это интерфейс evdev.
От Documentation/input/input.txt
в исходном коде ядра:
Вы можете использовать блокирующие и неблокирующие чтения, а также
select()
на/dev/input/eventX
устройства, и вы всегда получите целое число входных событий при чтении. Их расположение:
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
};
time
это метка времени, она возвращает время, когда произошло событие. Тип напримерEV_REL
для относительного момента,REL_KEY
для нажатия клавиши или выпуска. Больше типов определены вinclude/linux/input.h
,
code
это код события, напримерREL_X
или жеKEY_BACKSPACE
опять полный список вinclude/linux/input.h
,
value
значение, которое несет событие. Либо относительное изменение дляEV_REL
Абсолютно новое значение дляEV_ABS
(джойстики...) или 0 дляEV_KEY
для выпуска, 1 для нажатия клавиши и 2 для автоповтора.