本文转载自: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. C#语言最基础的数组和集合

    数组的书写格式:数据类型[]变量名=new 数据类型[长度]: 集合的书写格式:List<变量类型>变量名=new List<变量类型>(): 集合添加元素:变量名.Add(数 ...

  2. Java——Spring介绍

    spring 是一个开源框架,是为了解决企业应用程序开发. 功能如下:1.目的:解决企业应用开发的复杂性.2.功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能.3.范围:任何Ja ...

  3. asp.net——统计输入的字符数目

    asp.net——统计输入的字符数目 题目: 在页面中有一个TextBox输入框,一个显示文字用的Label,一个提交按钮Button.在TextBox中输入一段英文字母,点击按钮提交后统计其中字母‘ ...

  4. DeltaFish 小组成员及个人博客地址

    艾寅中  http://www.cnblogs.com/aiyz 陈志锴  http://www.cnblogs.com/chenzhikai 李   鑫  http://www.cnblogs.co ...

  5. JS——鼠标在盒子中的坐标

    核心思想: 1.复杂版本:鼠标pageX.pageY的值减去盒子距离顶端的offsetLeft.offsetTop值就是鼠标在盒子中的坐标 2.简单版本:offsetX.offsetY就可获取鼠标相对 ...

  6. ffmpeg从内存读取文件

    正常情况,ffmpeg直接从文件读取 AVFormatContext * _ctx = NULL; avformat_open_input(&_ctx, _filePath, 0, 0); 我 ...

  7. NFS指定端口,NFS缓存(转载)

    nfs服务端: #编辑/etc/nfsmount.conf,在末尾添加: #RQUOTAD_PORT=30001#LOCKD_TCPPORT=30002#LOCKD_UDPPORT=30002#MOU ...

  8. 无需编写代码,用接口管理工具 eoLinker 高效完成API测试流程相关业务

    引言 作为开发人员,有时需要协助市场部门进行开发,比如在市场推广中,经常通过给用户赠送优惠券来提高复购率.这篇文章,将介绍如何使用接口管理工具 eoLinker 的自动化测试 [UI模式] 构建此业务 ...

  9. 【LeetCode】1、Two Sum

    题目等级:Easy 题目描述:   Given an array of integers, return indices of the two numbers such that they add u ...

  10. 环形缓冲区: ringbuf.c

    #cat aa.c /*ringbuf .c*/ #include<stdio.h> #include<ctype.h> #define NMAX 8 int iput = 0 ...