本文转载自:https://my.oschina.net/u/157503/blog/91548

1、问题 
通过一个死循环将读取键盘对应的设备文件将触发键盘事件在屏幕上打印出来,按esc退出程序 
代码是在unbuntu10.04编译执行通过的 
2、input_event描述 
在Linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作就是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构体描述),不再需要关心文件操作接口,因为Input子系统已经完成了文件操作接口 
linux/input.h 这个文件定义了event事件的结构体,API和标准按键的编码等; 
struct input_event { 
struct timeval time;  //按键时间 
__u16 type; //事件类型 
__u16 code; //要模拟成什么按键 
__s32 value;//是按下还是释放 
};

type,指事件类型,常见的事件类型有: 
EV_KEY, 按键事件,如键盘的按键(按下哪个键),鼠标的左键右键(是非击下)等; 
EV_REL, 相对坐标,主要是指鼠标的移动事件(相对位移); 
EV_ABS, 绝对坐标,主要指触摸屏的移动事件 
code:事件的代码. 
如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.0~127为键盘上的按键代码 
关于按键代码的定义,部分如下所示: 
#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 KEY_W  17 
#define KEY_E  18  
#define KEY_R  19  
#define KEY_T  20 
value: 
事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_REL,value的正数值和负数值分别代表两个不同方向的值.

3、相关代码 
key_simulator.c 
#include 
#include 
#include 
#include 
#include

int main () 

int keys_fd; 
char ret[2]; 
struct input_event t;

keys_fd = open ("/dev/input/event2", O_RDONLY); 
if (keys_fd <= 0) 

printf ("open /dev/input/event2 device error!\n"); 
return 0; 
}

while (1) 

if (read (keys_fd, &t, sizeof (t)) == sizeof (t)) 

if (t.type == EV_KEY) 
if (t.value == 0 || t.value == 1) 

printf ("key %d %s\n", t.code, 
(t.value) ? "Pressed" : "Released"); 
if(t.code==KEY_ESC) 
break; 



close (keys_fd);

return 0; 
}

4、注意问题 
1)不同的类型计算机,设备对应event信息会有所不同 
可以用cat获得的设备对应event信息: 
# cat /proc/bus/input/devices 
I: Bus=0019 Vendor=0000 Product=0001 Version=0000 
N: Name="Power Button" 
P: Phys=LNXPWRBN/button/input0 
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input0 
U: Uniq= 
H: Handlers=kbd event0 
B: EV=3 
B: KEY=100000 0 0 0

I: Bus=0017 Vendor=0001 Product=0001 Version=0100 
N: Name="Macintosh mouse button emulation" 
P: Phys= 
S: Sysfs=/devices/virtual/input/input1 
U: Uniq= 
H: Handlers=mouse0 event1 
B: EV=7 
B: KEY=70000 0 0 0 0 0 0 0 0 
B: REL=3

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41 
N: Name="AT Translated Set 2 keyboard" 
P: Phys=isa0060/serio0/input0 
S: Sysfs=/devices/platform/i8042/serio0/input/input2 
U: Uniq= 
H: Handlers=kbd event2 
B: EV=120013 
B: KEY=4 2000000 3803078 f800d001 feffffdf ffefffff ffffffff fffffffe 
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=/devices/platform/i8042/serio1/input/input3 
U: Uniq= 
H: Handlers=mouse1 event3 
B: EV=7 
B: KEY=70000 0 0 0 0 0 0 0 0 
B: REL=103

I line:这行包含身份信息,显示了 bus type是 3 (usb), vendor, product, version等信息。 
N line:这行包含了名字信息。 
P line:这行包含了物理设备信息。 
H line: 这行包含了与设备关联的 handler drivers。 
B line: 这些行包含了显示设备能力的一些位域 (bitfield)。 
我的键盘对应的事件类型是event2

2)open /dev/input/event2 device error 
需要使用sudo或者改变设备的属性 
如下: 
sudo ./key_simulator 
或者 
chmod 777 /dev/input/event2

本文欢迎转载,转载请注明作者与出处

作者:流星

出处:http://blog.sina.com.cn/staratsky

linux下获取按键响应事件【转】的更多相关文章

  1. Linux 下获取LAN中指定IP的网卡的MAC(物理地址)

    // all.h// 2005/06/20,a.m. wenxy #ifndef _ALL_H#define _ALL_H #include <memory.h>#include < ...

  2. Linux下获取硬盘使用情况

    Linux下获取硬盘使用情况[总结] 1.前言 在嵌入式设备中,硬盘空间非常有限,在涉及到经常写日志的进程时候,需要考虑日志的大小和删除,不然很快就硬盘写满,导致日志程序崩溃.为了捕获硬盘写满的异常场 ...

  3. .net core在Linux下获取AD域信息

    .net core在Linux下获取AD域信息 .net Core 2.1.4 .net core现在System.DirectoryServices只支持Windows平台下使用. 参考: http ...

  4. Linux下获取和设置IP

    在Linux下获取关于IP和网关的操作:重点是对struct ifreq 的操作. 那么进入目录/usr/include/net/if.h下看查找struct ifreq结构体. /* Interfa ...

  5. window/linux下获取文件MD5

    MD5消息摘要算法(英语: MD5 Message-Digest Algorithm), 主要用于确保信息传输过程的一致性校验.   首先介绍两个工具: window: WinMD5Free Linu ...

  6. Linux下获取本机IP地址的代码

    Linux下获取本机IP地址的代码,返回值即为互联网标准点分格式的字符串. #define ETH_NAME "eth0" //获得本机IP地址 char* GetLocalAdd ...

  7. linux下获取占用CPU资源最多的10个进程

    linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...

  8. Linux下获取arm的交叉编译工具链

    转载请注明文章:Linux下获取arm的交叉编译工具链 出处:多客博图 这里介绍,Linux下获取arm的交叉编译工具链,比如arm-linux-gnueabihf-gcc.arm-linux-gne ...

  9. 在Windows及Linux下获取毫秒级运行时间的方法

    在Windows下获取毫秒级运行时间的方法 头文件:<Windows.h> 函数原型: /*获取时钟频率,保存在结构LARGE_INTEGER中***/ WINBASEAPI BOOL W ...

随机推荐

  1. Android popupwindow和dialog监听返回键

    使用情况: 在activity中,出现了popupwindow和dialog,这个时候,如果点击返回键,它们消失了,但是一些操作还在继续.如:1.进行耗时操作,出现dialog提醒用户等待,这时,按下 ...

  2. [Android]异常2-Unexpected error while executing

    异常原因: 可能一>Android Studio的自动编译没有成功 解决方法有: 解决一>菜单栏里的“Build”,“Clean Project” 注:

  3. C#——枚举格式转换与比较

    定义一个枚举类型: public enum City { 北京, 上海, 广州 } 控制台判断: static void Main(string[] args) { Console.WriteLine ...

  4. The Standard SSL Handshake

    The following is a standard SSL handshake when RSA key exchange algorithm is used: 1.  Client Hello ...

  5. Object.create() __https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create

    Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象. 语法 Object.create(proto[, propertiesObject]) 参数 proto 新创建对 ...

  6. 一、Scrapy入门教程

    本文转载自以下链接:https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html 在本篇教程中,我们假定您已经安装好Scrapy ...

  7. Python基础-奇偶判断调用函数

    编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数 1/1+1/3+...+1/n. 首先写一个n为偶数的函数: def peven(n): s = 0 ...

  8. 基于Ubuntu系统的Tomcat部署项目

    第一步.拿到项目war包 第二步.上传到服务器/var/lib/tomcat8/webapps/ROOT目录下 第三步.使用命令解压war包 jar -xvf star1.0.0.war 第三步.重启 ...

  9. Android第三方开源图片裁剪截取:cropper

     Android第三方开源图片裁剪截取:cropper 很多app都需要裁剪截取图片作为头像.logo之类,而cropper是github上的一个针对Android平台的.第三方开源图片裁剪截取项 ...

  10. Nginx不转发http header

    使用nginx做http代理时,在Header中使用了一个名为api_key的属性,碰到http header不转发的问题. 问题源码: rc = ngx_http_parse_header_line ...