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

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

作者:流星

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

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

Linux下获取硬盘使用情况

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

&period;net core在Linux下获取AD域信息

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

Linux下获取和设置IP

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

window&sol;linux下获取文件MD5

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

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

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

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

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

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

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

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

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

随机推荐

MySql&colon; 忘记root密码

win7 + mysql 5.6.35 C:\Windows\system32>mysql --versionmysql Ver 14.14 Distrib 5.6.35, for Win64 ...

读javascript高级程序设计15-Ajax&comma;CORS&comma;JSONP&comma;Img Ping

平时用惯了jQuery.ajax之类的方法,却时常忽略了它背后的实现,本文是学习了AJAX基础及几种跨域解决方案之后的一些收获. 一.AJAX——XMLHttpRequest 谈起Ajax我们都很熟悉 ...

200 OK &lpar;from cache&rpar; 与 304 Not Modified

解释: 200 OK (from cache)  是浏览器没有跟服务器确认,直接用了浏览器缓存: 304 Not Modified 是浏览器和服务器多确认了一次缓存有效性,再用的缓存. 触发区别: 2 ...

ASP&period;NET MVC 学习2、从Controller传递数据到View

参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view 一,Control ...

BZOJ 1048 &lbrack;HAOI2007&rsqb;分割矩阵

1048: [HAOI2007]分割矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 623  Solved: 449[Submit][Status ...

ccf练习---节日

问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日. 现在,给你a,b,c和y1, y2(1850 ≤ y1, y2 ≤ 2 ...

JavaMail收发邮件的一般流程与主要方法

1.Properties属性类 Properties p = new Properties(); p.put(key, value); key -| mail.smtp.host -| mail.sm ...

iOS 获取高速随机路径sandbox目录

NSLog(@"%@", NSHomeDirectory());//沙盒主目录 NSLog(@"%@", NSTemporaryDirectory());//砂 ...

用C语言实现Ping程序功能

本文转载自:http://www.ibm.com/developerworks/cn/linux/network/ping/ ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具.p ...

php优秀框架codeigniter学习系列——CI&lowbar;Lang类学习

这篇文章主要介绍CI核心框架工具类CI_Lang. 根据CI文档自己的定义,该类用来: 提供相关的函数,用于检索语言文件和文本行,以便国际化. 以下选取类中的重点方法进行说明. __construct ...

arm shell 获取本地键盘输入值_linux下获取按键响应事件【转】相关推荐

  1. arm shell 获取本地键盘输入值_arm Linux 如何自动检测并mount SD卡,以及如何得知已经mount...

    一.土八路做法: SD 卡一旦插入系统,内核会自动在/dev/下创建设备文件:sdcard. 但有时可能时用户在拨出卡前并没有umount的话,第二次插卡进去后系统创建的就不是sdcard设备文件了, ...

  2. html 按下和松开事件,JQuery通过键盘控制键盘按下与松开触发事件

    JQuery通过键盘控制键盘按下与松开触发事件 效果图: HTML部分: 首先设置几个盒子,用来构建这个页面的大致框架. 给盒子相应的类名以及id,方便css的布局以及JQuery的获取. 在盒子内放 ...

  3. vue获取本地php数据,Vue-cli项目获取本地json文件数据的实例

    下面我就为大家分享一篇Vue-cli项目获取本地json文件数据的实例,具有很好的参考价值,希望对大家有所帮助. 在自己做的vue demo项目中,我想通过在本地添加一些json数据,写到json文件 ...

  4. qt获取本机全部ipv4_QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址...

    获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...

  5. php cli获取参数,php cli模式下获取参数的方法

    PHP在cli模式下接收参数有两种方法 1.使用argv数组 2.使用getopt方法 1.使用argv数组 例如:需要执行一个php,并传递三个参数(type=news, is_hot=1, lim ...

  6. linux下获取按键响应事件(转)

    1.问题  通过一个死循环将读取键盘对应的设备文件将触发键盘事件在屏幕上打印出来,按esc退出程序  代码是在unbuntu10.04编译执行通过的 2.input_event描述  在Linux内核 ...

  7. popen 如何获取指令执行情况_Linux下使用popen()执行shell命令

    简单说一下popen()函数 函数定义 #include FILE* popen(const char *command , const char *type );int pclose(FILE *s ...

  8. linux mysql 系统时间函数吗_linux下获取系统时间的方法

    可以用 localtime 函数分别获取年月日时分秒的数值. Linux下获得系统时间的C语言的实现方法: 1. 可以用 localtime 函数分别获取年月日时分秒的数值. #include     ...

  9. linux的mysql本地yum安装_linux下使用yum安装mysql

    mysql yum repository提供linux平台上面的MySQL server, client和其它组件的rpm包.它支持以下平台: 基于EL5-, EL6-, 和 EL7-的平台,比如对应 ...

最新文章

  1. 三数之和(三数不重复)
  2. 2020双十一实时大屏_双十一实时“战报”来了,你贡献了多少?
  3. 40亿骚扰电话拨出,6亿用户隐私泄露,央视315曝光AI黑暗面
  4. Linux 系统双网卡绑定 bond的7种模式
  5. stm32_DMA采集一个AD数据_并通过DMA向串口发送
  6. PCD Lesson3:PCD文件的读取
  7. Callable接口与runable和Thread类
  8. IP地址的定义和含义
  9. 你知道怎么解决DB读写分离,导致数据不一致问题吗?
  10. python通讯录运用的知识点_Python实现通讯录功能
  11. JVM Specification 9th Edition (4) Chapter 3. Compiling for the Java Virtual Machine
  12. MATLAB自学教程一1.显示图像图像基本信息
  13. 2019年虚拟机备份软件大盘点
  14. GD32F103 USB 虚拟U盘实验一(内部Flash)
  15. 六个步骤教你学会用ZBrush绘制头部模型
  16. 耳机插入电脑没反应 控制面板也找不到realtek音频管理器的解决方案
  17. android卡在gradle,Android Studio打开新项目卡在Gradle的问题
  18. 拼多多活动主图尺寸多少?企立方来告诉你!
  19. 在 Chrome 中清除、启用和管理 Cookie
  20. 设置监察哨的顺序查找

热门文章

  1. 【注意事项】Markdown遇到的小问题
  2. Java 打印数组的方法
  3. java中标识符,关键字,数据类型
  4. DAY74-Django框架(五)
  5. centos 6安装 vim
  6. Solr索引和基本数据操作
  7. 编写函数求两个整数 a 和 b 之间的较大值。要求不能使用if, while, switch, for, ?: 以 及任何的比较语句。...
  8. Code Forces Bear and Forgotten Tree 3 639B
  9. 重磅推出:AutoProject Studio 自动化项目生成器
  10. Asp.net后台创建HTML