• linux下获取按键响应事件【转】


    本文转载自: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! "); 
    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 ", 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

  • 相关阅读:
    MFC9.0 Outlook控件的标题显示无法修改
    VS2010 单文档+多视图+Outlook风格
    在VS2010中使用Outlook工具栏
    在MFC中添加用户自定义消息
    读书笔记——Windows环境下32位汇编语言程序设计(13)关于EXCEPTION_DEBUG_INFO结构体
    读书笔记——Windows环境下32位汇编语言程序设计(9)ANSII字符大小写转大写
    读书笔记——Windows环境下32位汇编语言程序设计(6)使用浮点指令进行64位除法
    读书笔记——Windows环境下32位汇编语言程序设计(5)模态对话框
    读书笔记——Windows环境下32位汇编语言程序设计(3)一些基础知识
    设置自己的RadASM颜色
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7325922.html
Copyright © 2020-2023  润新知