linux 下如何通过软件模拟按键

http://blog.csdn.net/ssmile/article/details/6297423

 

出处:http://hi.baidu.com/mgqw/blog/item/ef91923810ca85f8b311c705.html

名词解释:
scancode: 驱动对硬件的标记
keycode: 上层应用程序所见的标记,跟硬件的标记不同, 一般为KEY_F1之类的宏

一般驱动将scancode绑定到keycode
对未绑定的scancode, 可以通过setkeycodes将将其绑定到未使用的keycode
注: 有些按键会被解释成acpi event, 可以通过acpi_listen来监听,但不一定成功,目前还没具体了解

模 拟按键是上层应用程序的行为, 所以不需要编译成模块,只需要想平常的应用程序那样编译就可以了, 不过它要包含<linux/input.h>这个文件, 同时要明确键盘对应的/dev/input/event[0-4]到底是哪个文件, 此外还需要以root权限来运行

赖半仙注解:
运行命令 cat /proc/bus/input/devices  在输出里面查找 xxx keyboard 对应的文件是/dev/input/event几。我开始想当然的以为键盘文件是event1,结果死人都调不出来,弄了很久最后从event0开始一个 一个试,才发现我的手提电脑键盘文件对应的是event4。

在我的电脑上运行命令 ls /dev/input/event* 发现有好多输入设备…………
/dev/input/event0  /dev/input/event10  /dev/input/event2  /dev/input/event4  /dev/input/event6  /dev/input/event8
/dev/input/event1  /dev/input/event11  /dev/input/event3  /dev/input/event5  /dev/input/event7  /dev/input/event9


下面是 cat /proc/bus/input/devices 命令对应键盘文件的一段输出
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/input4
U: Uniq=
H: Handlers=kbd event4
B: EV=120013
B: KEY=8000 0 0 0 0 0 5007 2002000 380307c f800d001 feffffdf ffefffff ffffffff ffffffff
B: MSC=10
B: LED=7

下面的程序是模拟按键NumLock,就是控制小键盘灯的那个按键,按下去(运行程序没有问题)后小键盘灯就会点亮或者熄灭。

    1.  #include <linux/input.h>  
    2. #include <time.h>  
    3. #include <fcntl.h>  
    4. #include <string.h>  
    5. #include <errno.h>  
    6. #include <stdio.h>  
    7.   
    8. void simulate_key(int fd, unsigned int keycode, int keyvalue)  
    9. {  
    10.     struct input_event event;  
    11.   
    12.     event.type = EV_KEY;  
    13.     event.code = keycode;  
    14.     event.value = keyvalue;  
    15.     gettimeofday(&event.time, 0);  
    16.   
    17.     if (write(fd, &event, sizeof(event)) < 0) {  
    18.         printf("simulate key error/n");  
    19.         return;  
    20.     }else  
    21.         printf("simuate key %d, %d/n", keycode, keyvalue);  
    22. }  
    23.   
    24.   
    25.   
    26.     int  
    27. main ( int argc, char *argv[] )  
    28. {  
    29.     char *path = "/dev/input/event1";  
    30.     unsigned int key_code = KEY_NUMLOCK;  
    31.   
    32.     if (argc >= 3) {  
    33.         path = argv[1];  
    34.         key_code = atoi(argv[2]);  
    35.     }else if (argc >= 2)  
    36.         path = argv[1];  
    37.   
    38.     int fd_kbd = open(path, O_RDWR);  
    39.   
    40.     if(fd_kbd <= 0) {  
    41.         printf("error open keyboard:%s/n", strerror(errno));  
    42.         return -1;  
    43.     }  
    44.   
    45.     simulate_key(fd_kbd, key_code, 1);  
    46.     simulate_key(fd_kbd, key_code, 0);  
    47.   
    48.     close(fd_kbd);  
    49.   
    50.     return 0;  
    51. }               /* ----------  end of function main  ---------- */ 
posted @ 2015-02-02 14:42  alxe_yu  阅读(375)  评论(0)    收藏  举报