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 для автоповтора.

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