Я предпочитаю следующее решение, потому что он разбирает файлы устройств внутри.
Если мы проверяем содержимое/Proc/автобус/ввода/устройств мы можем нашли что-то вроде этого:
# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0002 Product=0001 Version=0100
N: Name="vmouse"
P: Phys=vmouse/input0
S: Sysfs=/devices/virtual/input/input0
U: Uniq=
H: Handlers=mouse0 event0
B: PROP=0
B: EV=7
B: KEY=70400 0 0 0 0 0 0 0 0
B: REL=143
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-ths"
P: Phys=sunxiths/input0
S: Sysfs=/devices/virtual/input/input3
U: Uniq=
H: Handlers=event3
B: PROP=0
B: EV=9
B: ABS=100 0
I: Bus=0003 Vendor=1220 Product=0008 Version=0100
N: Name="HID 1220:0008"
P: Phys=usb-sunxi-ohci-1/input0
S: Sysfs=/devices/platform/sunxi-ohci.3/usb7/7-1/7-1:1.0/input/input6
U: Uniq=
H: Handlers=sysrq kbd event1
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=1f
I: Bus=0003 Vendor=1220 Product=0008 Version=0100
N: Name="HID 1220:0008"
P: Phys=usb-sunxi-ohci-1/input1
S: Sysfs=/devices/platform/sunxi-ohci.3/usb7/7-1/7-1:1.1/input/input7
U: Uniq=
H: Handlers=kbd mouse1 event2
B: PROP=0
B: EV=1f
B: KEY=4837fff 72ff32d bf544446 0 0 1f0001 20f90 8b17c000 677bfa d941dfed 9ed680 4400 0 10000002
B: REL=143
B: ABS=1 0
B: MSC=10
Так что единственное, что нам нужно, это найти номер устройства событий в блоке, где «EV = 120013» строка появились:
#include <fcntl.h>
#include <stdio.h>
#include <string>
#include <string.h>
#include <unistd.h>
using namespace std;
string getInputDeviceName() {
int rd;
std::string devName;
const char* pdevsName = "/proc/bus/input/devices";
int devsFile = open(pdevsName, O_RDONLY);
if (devsFile == -1) {
printf("[ERR] Open input devices file: '%s' is FAILED\n", pdevsName);
}
else {
char devs[2048];
if ((rd = read(devsFile, devs, sizeof(devs) - 1)) < 6) {
printf("[ERR] Wrong size was read from devs file\n");
}
else {
devs[rd] = 0;
char *pHandlers, *pEV = devs;
do {
pHandlers = strstr(pEV, "Handlers=");
pEV = strstr(pHandlers, "EV=");
}
while (pHandlers && pEV && 0 != strncmp(pEV + 3, "120013", 6));
if (pHandlers && pEV) {
char* pevent = strstr(pHandlers, "event");
if (pevent) {
devName = string("/dev/input/event");
devName.push_back(pevent[5]);
}
else {
printf("[ERR] Abnormal keyboard event device\n");
}
}
else {
printf("[ERR] Keyboard event device not found\n");
}
}
}
return devName;
}
NOTE1: Этот код работает на устройствах событий с номерами менее 10
Примечание2: Пожалуйста, проверьте «дэвы» размер буфера, в системе 2048 байт может б e недостаточно.