通过直接操作驱动来监控键盘,只要程序一旦在后台启动,无论在任何页面都可以监控到按键的数值。

步骤如下:

1.找到键盘挂在点:有两种方法

  方法一:在   /dev/input路径下通过  cat even..(1,2,3,4.。)打印操作,并按下键盘看哪个出现的不是回写(乱码状态),就是键盘挂载点,我的是event1;鼠标是event2;

  方法二:在命令行中输入  cat /proc/bus/input/devices 查看设备对应的结点(文件)

2.打开键盘文件:

  #define      DEV      "/dev/input/event1"

  int keyFd;

  keyFd=open(DEV,RDONLY);

3.读键盘数据

  问:读的数据应该以什么类型存放?

  解:所有的输入设备都公用一个头文件,即共用这一个框架,头文件为<linux/input.h>,

/////////////////////////////这是头文件中的结构体,不用写//////////////////////////////////////////////////////////////////////////// 

    struct input_event {
        struct timeval time;
            __u16 type;//按键类型

       —u16code;//按键值
           __s32 value;//按下为1,长按为2,松开为0
        };

//////////////////////////////////////////////////////////////////////////////////////////////////////

    int ret;      struct input_event    ev;

    ret=read(devFd,&ev,sizeof(ev));

  每一次从键盘读到的值都存在这样的一个结构体中;

5.访问数据

  通过结构体变量ev可以访问数据。

代码示例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
//设备头文件
#include <linux/input.h>

//cat /proc/bus/input/devices 查看设备对应的结点(文件)
#define KEY_DEV "/dev/input/event3"

char mapKey(unsigned short code)
{
switch(code){
case KEY_A:return 'a';
case KEY_B:return 'b';
case KEY_C:return 'c';
case KEY_D:return 'd';
case KEY_E:return 'e';
case KEY_F:return 'f';
case KEY_G:return 'g';
case KEY_5:return '5';
case KEY_KP4:return '4';
case KEY_ENTER:return '\n';
default:return '?';
}
}

int main(void)
{
int devFd,ret;
//input 子系统设备以该结构体提交一个事件
struct input_event ev;

devFd=open(KEY_DEV,O_RDONLY);
if(devFd==-1)
{
perror("open Keyboard");
return 1;
}

system("clear");
system("stty -echo");

//读按键数据
while(1)
{
ret=read(devFd,&ev,sizeof(ev));
if(ret==-1)
{
perror("read error");
break;
}
switch(ev.type){
case EV_SYN:;break;
case EV_KEY:
if(ev.value==1 || ev.value==2)
{
putchar(mapKey(ev.code));
fflush(stdout);
}
break;
case EV_REL:
printf("相对 code:%d value:%d\n",ev.code,ev.value);break;
case EV_ABS:
printf("绝对 code:%d value:%d\n",ev.code,ev.value);break;
}
}

system("stty echo");
close(devFd);
return 0;
}

    

input之按键输入的更多相关文章

  1. linux输入子系统(input subsystem)之按键输入和LED控制

    实验现象:在控制台打印按键值,并且通过按键控制相应的LED亮灭. 1.代码 input_subsys_drv.c #include <linux/module.h> #include &l ...

  2. adb shell命令模拟按键/输入input使用keycode 列表详解

    在adb shell里有一个非常使用的命令,模拟按键输入,这里首先不要理解为是键盘的模拟按键,下面命令的使用和键值做一个详解. input命令格式 adb shell input keyevent & ...

  3. ADB——模拟手机按键输入

    基本命令 adb 模拟按键输入的命令主要通过 input 进行 Usage: input [<source>] <command> [<arg>...] The s ...

  4. adb命令模拟按键输入keycode

    adb命令模拟按键输入keycode 2017年05月18日 14:57:32 阅读数:1883 例子: //这条命令相当于按了设备的Backkey键 adb shell input keyevent ...

  5. linux下如何模拟按键输入和模拟鼠标【转】

    转自:http://www.cnblogs.com/leaven/archive/2010/11/30/1891947.html 查看/dev/input/eventX是什么类型的事件, cat /p ...

  6. 控制input中只能输入固定格式内容

    onkeyup 事件会在键盘按键被松开时发生,onafterpaste 是粘贴触发,没有这个事件用onblur吧,失去焦点时发生输入完,点其他地方就会执行. <html lang="e ...

  7. 关于调整input里面的输入光标大小

    input输入框用一个背景图模拟,设置height和line-height一样的高度,使里面的输入文字能够居中, 在FF下出现的情况是:点击input时,输入光标其实上跟input的height一样高 ...

  8. 使用iScroll时,input等不能输入内容的解决方法

    做移动平台的应用,使用iscroll使屏幕上下滑动.发现当使用iscroll后,input等不能输入内容了.只要在iscroll.js文件中加入如下代码就ok了. function allowForm ...

  9. 使用iScroll时,input等不能输入内容的解决方法(share)

    最近做移动平台的应用,使用iscroll使屏幕上下滑动.发现当使用iscroll后,input等不能输入内容了.只要在iscroll.js文件中加入如下代码就ok了. function allowFo ...

随机推荐

  1. Q1:Two Sum

    1. Two Sum 官方的链接:1. Two Sum Description : Given an array of integers, return indices of the two numb ...

  2. vue 中使用 vue-fullpage

    安装并使用 安装 npm install --save vue-fullpage.js 引入 // 引用fullpage 插件 import Vue from 'vue' import 'fullpa ...

  3. windows 10下的python开发环境

    linux子系统 按照文档 https://www.jianshu.com/p/2bcf5eca5fbc 的前五步,完成 ubuntu子系统安装. 不需安装图形桌面,无使用价值. 在https://w ...

  4. java8 String intern()

    public class Solution { public static void main(String[] args) { String a = new String("he" ...

  5. 吴裕雄--天生自然 JAVASCRIPT开发学习: this 关键字

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. protobuf 的enum与string转换

    c/c++ enum 介绍 说起c/c++ 的enum,比起python 真的是方便简洁 enum type{ type1 = 0, type2 } enum的元素对应的int 默认从0 开始依次增加 ...

  7. Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.postgresql.util.PSQLException: 栏位索引超过许可范围:2,栏位数:1

    执行mybaits sql <delete id="delete4BatchesByLineCi" parameterType="java.util.List&qu ...

  8. C#——发送邮件

    需要2个引用 using System.Net;using System.Net.Mail; using (MailMessage mailMessige=new MailMessage()) usi ...

  9. jquery判断字符串中是否包含特定字符的方法总结

    方法一:使用indexOf() 和lastIndexOf()方法 案例: var Cts = "bblText"; if(Cts.indexOf("Text") ...

  10. Xcode7以后访问http加密

    Xcode7 在Info.plist中add Row添加NSAppTransportSecurity类型Dictionary. 在NSAppTransportSecurity下添加NSAllowsAr ...