Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185553
  • 博文数量: 60
  • 博客积分: 1597
  • 博客等级: 上尉
  • 技术积分: 461
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-20 13:24
文章分类

全部博文(60)

文章存档

2017年(15)

2016年(6)

2015年(37)

2008年(2)

分类: LINUX

2015-03-20 10:42:57

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:事件值

获取输入:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <linux/input.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>

  6. int main()
  7. {
  8.         int fd;
  9.         struct input_event event;

  10.         fd = open("/dev/input/event0", O_RDONLY); //打开输入文件根据实际情况
  11.         if(fd <= 0)
  12.         {
  13.                 printf("open device error\n");
  14.                 return 0;
  15.         }

  16.         while(1)
  17.         {
  18.                 if(read(fd, &event, sizeof(event)) == sizeof(event))
  19.                 {
  20.                     if (event.type == EV_KEY)
  21.                         if (event.value == 0 || event.value == 1)
  22.                         {
  23.                                 printf("key %d %s\n", event.code, (event.value) ? "Pressed" : "Released");
  24.                                 if(event.code == KEY_ESC)
  25.                                         break;
  26.                         }
  27.                 }
  28.         }
  29.         close(fd);
  30.         return 0;
  31. }
"/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

struct input_event 写入 /dev/input/event0 可以模拟键盘输入


阅读(6334) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~