Я пытаюсь захватить ввод с клавиатуры в программе на C / C ++, не требуя привилегий root и без использования X11 XNextEvent()
.
Я пытался открыть устройство напрямую, но по очевидным причинам безопасности для доступа к оборудованию напрямую требуются права доступа root. Устройство, которое я пытаюсь открыть, это /dev/input/by-id/(my keyboard name here)
, которое отображается на канал событий (/dev/input/event<#>
), для чтения которого требуется root.
Библиотека X11 позволяет мне записывать события клавиатуры (используя XNextEvent
), но я не могу полагаться на то, что клиент, на котором установлен X11, установлен в тех случаях, когда он хочет работать без головы и без графического интерфейса.
Мне нужно иметь возможность захватывать все клавиши клавиатуры, включая shift kbd>, alt kbd>, ctrl kbd> и super kbd> (windows или mac) ключ. Предпочтительно, я также хотел бы захватывать мультимедийные клавиши, такие как воспроизведение, увеличение / уменьшение громкости и т. Д., И только когда приложение находится в фокусе.
Кто-нибудь знает, как я мог бы это сделать?
Я думал просто сделать два разных пути кода для ввода, один для безголового, в котором они будут получать события, просто используя stdin (но это не будет ловить клавишу Shift (AFAIK), а другой путь использует X11, но я бы хотел, если возможно, поддерживать только одну систему ввода с клавиатуры.
Лучшее решение, которое я мог найти, состоит в том, чтобы сделать отдельного демона, которые работают как сервис, которые контролируют /dev/input/..
события и позволяют другим пользовательским инструментам, чтобы соединиться с собой и прислушаться к входным событиям.
Думают что-то та замена XEvent. (приносящий те входные события к пространству пользователя)