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用户空间注册按键事件,linux下获取按键响应事件相关推荐

  1. linux用户空间内存分布,了解linux 64位地址空间内存布局

    主要搞清楚下列问题: 1.X86-64 页式管理有哪些改变? 2.Linux是怎样支持64bit地址管理? 3.64bit 内存布局是怎么样的? 1. X86-64 页式管理 查看<64-ia- ...

  2. linux用户空间 限制吗,在Linux中限制用户空间

    在Linux中限制用户的磁盘使用空间使用的是Quota,一般Quota在安装Linux时就已包括在内核中,不需要另行安装.Quota可以从两方面指定磁盘的储存限制: 使用者所能够支配的索引节点(ino ...

  3. 键盘事件介绍——onKeyPress-输入字母和数字、onKeyUp-放开任何按键、onKeyDown-按下任何按键 el-input 只能输入正整数验证并限制长度

    键盘事件介绍--onKeyPress-输入字母和数字.onKeyUp-放开任何按键.onKeyDown-按下任何按键 & el-input 只能输入正整数验证并限制长度 1.onKeyPres ...

  4. linux vg划分目录,【案例】Linux /根目录空间不足 在线实现linux根目录vg扩展

    [案例]Linux /根目录空间不足 在线实现linux根目录vg扩展 时间:2016-10-17 20:46   来源:Oracle研究中心   作者:网络   点击: 次 天萃荷净 运维DBA反映 ...

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

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

  6. linux 用户空间 timer,Linux时间子系统(十五) clocksource

    一.前言 和洋葱一样,软件也是有层次的,内核往往需要对形形色色的某类型的驱动进行抽象,屏蔽掉其具体的特质,获取该类驱动共同的逻辑,而又根据这些逻辑撰写该类驱动的抽象层.嵌入式系统总是会提供timer的 ...

  7. linux 内核将两个设备相关联,linux用户空间和内核空间交换数据

    转载地址:http://www.poluoluo.com/server/201107/138420.html 在研究dahdi驱动的时候,见到了一些get_user,put_user的函数,不知道其来 ...

  8. 对linux用户空间DMA的分析(和单片机一样简单)

    一般情况下,对外设的操作包括轮训方式.中断方式,对于数据量很大的情况会用到DMA操作.本文介绍一种在用户空间实现DMA操作的方法来获取AXI总线上的数据,FPGA部分暂时不详细说明,之后会有专题来介绍 ...

  9. linux 用户空间文件系统 filesystem in userspace fuse 简介

    用户空间文件系统(Filesystem in Userspace,简称FUSE)是操作系统中的概念,指完全在用户态实现的文件系统.目前Linux通过内核模块对此进行支持.一些文件系统如ZFS,glus ...

最新文章

  1. 下拉列表 php,php数组生成html下拉列表的方法
  2. hashcode()和hash()
  3. mvvm模式和mvc的区别_Android 开发中的架构模式 -- MVC / MVP / MVVM
  4. struts2使用注解--ACTION中的应用
  5. 像淘宝一样“网购装修”,“当家”助推家装互联网走向“广域网”
  6. 百米路由器2登陆地址_女孩子也要会的无线路由器连接技巧,再也不求男生了...
  7. php对象比较大小,PHP 面向对象:对象的比较
  8. php scrscriptipt,XSS挑战之旅闯关笔记
  9. win10怎么修改服务器地址,电脑Windows10怎么修改IP地址的方法
  10. linux执行sh文件 查进程,linux – 用于检查进程是否已在运行的Shell脚本,如果是,则退出...
  11. mysql study_mysql_study_3
  12. HTML+CSS基础学习:HTML
  13. 逻辑思维训练500题(带答案)
  14. PyQt4---QTextBrowser
  15. 如何把播放器转换成HTML5,Chrome把普通flash播放器转变成HTML5播放器插件:HTML5ify...
  16. 2021-10-11
  17. 英文文本关系抽取(fine-tune Huggingface XLNet)
  18. 认认真真推荐10个优秀的公众号
  19. Apache+Python+Windows进行CGI编程新手上路时的各种坑
  20. 计算机体系结构实验 (实验报告)

热门文章

  1. python条件输出_python基础(二)条件判断、循环、格式化输出
  2. php haystack,haystack(示例代码)
  3. keras 多层lstm_机器学习100天-Day2403 循环神经网络RNN(训练多层RNN)
  4. 从数学的角度来谈谈,孩子为什么要学编程!
  5. html div父集子集,抛砖引玉css系列---根据父元素包含的子元素个数,实现不同的样式...
  6. java面试中jvm执行子系统详细分析(三)
  7. xyCMS框架的webshell
  8. java开机自启动 Linux,java项目jar包开机自启(WINDOWS,Linux)
  9. angularjs 利用filter进行表单查询及分页查询
  10. 富文本wangEditor的批量激活