分享

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

 arm_embed 2012-08-08
linux 下如何通过软件模拟按键[转-修改]
2009-10-29 11:10
转自:
http://zhgw01.blog.163.com/blog/static/10414812200992854628702/

参考http://www./viewarticle.php?id=104221

名词解释:
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,就是控制小键盘灯的那个按键,按下去(运行程序没有问题)后小键盘灯就会点亮或者熄灭。


 #include <linux/input.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>

void simulate_key(int fd, unsigned int keycode, int keyvalue)
{
struct input_event event;

event.type = EV_KEY;
event.code = keycode;
event.value = keyvalue;
gettimeofday(&event.time, 0);

if (write(fd, &event, sizeof(event)) < 0) {
printf("simulate key error\n");
return;
}else
printf("simuate key %d, %d\n", keycode, keyvalue);
}



int main ( int argc, char *argv[] )
{
char *path = "/dev/input/event1";
unsigned int key_code = KEY_NUMLOCK;   //键值: NumLock
//unsigned int key_code = KYE_A;        //键值:a  

if (argc >= 3) {
path = argv[1];
key_code = atoi(argv[2]);
}else if (argc >= 2)
path = argv[1];

int fd_kbd = open(path, O_RDWR);

if(fd_kbd <= 0) {
printf("error open keyboard:%s\n", strerror(errno));
return -1;
}

simulate_key(fd_kbd, key_code, 1);
simulate_key(fd_kbd, key_code, 0);

close(fd_kbd);

return 0;
}               /* ----------  end of function main  ---------- */

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多