linux中键盘鼠标等输入设备通过input子系统实现设备驱动,驱动程序完成向系统报告输入事件,input子系统完成了文件操作接口
linux/input.h定义了输入事件结构体 api 和 按键定义等
struct input_event {
struct
timeval time;
__u16 type;
__u16 code;
__s32
value;
};
type:类型
#define EV_SYN 0x00
#define EV_KEY 0x01 //键盘按键(包括鼠标键)
#define EV_REL 0x02 //鼠标移动
#define EV_ABS 0x03
#define EV_MSC 0x04
#define EV_SW 0x05
#define EV_LED 0x11
#define EV_SND 0x12
#define EV_REP 0x14
#define EV_FF 0x15
#define EV_PWR 0x16
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
code:事件码
#define KEY_RESERVED 0
#define KEY_ESC 1
#define KEY_1 2
#define KEY_2 3
#define KEY_3 4
#define KEY_4 5
#define KEY_5 6
#define KEY_6 7
#define KEY_7 8
#define KEY_8 9
#define KEY_9 10
#define KEY_0 11
#define KEY_MINUS 12
#define KEY_EQUAL 13
#define KEY_BACKSPACE 14
#define KEY_TAB 15
#define KEY_Q 16
。。。。。。
#define REL_X 0x00
#define REL_Y 0x01
。。。。。。
value:事件值
获取输入:
点击(此处)折叠或打开
#include
#include
#include
#include
#include
int main()
{
int fd;
struct input_event event;
fd = open("/dev/input/event0", O_RDONLY); //打开输入文件根据实际情况
if(fd <= 0)
{
printf("open device error\n");
return 0;
}
while(1)
{
if(read(fd, &event, sizeof(event)) == sizeof(event))
{
if (event.type == EV_KEY)
if (event.value == 0 || event.value == 1)
{
printf("key %d %s\n", event.code, (event.value) ? "Pressed" : "Released");
if(event.code == KEY_ESC)
break;
}
}
}
close(fd);
return 0;
}
"/dev/input/event0" 键盘事件,查看 /proc/bus/input/devices 可以确定各设备对应的设备文件
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/class/input/input0
H: Handlers=kbd event0//键盘对应event0
B: EV=120013
B: KEY=402000000 3802078f840d001 feffffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7
I: Bus=0011 Vendor=0002 Product=0005 Version=0000
N: Name="ImPS/2 Generic Wheel Mouse"
P: Phys=isa0060/serio1/input0
S: Sysfs=/class/input/input1
H: Handlers=mouse0 event1//鼠标event1
B: EV=7
B: KEY=70000 0 0 0 0
B: REL=103
把structinput_event 写入 /dev/input/event0 可以模拟键盘输入