免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2556 | 回复: 2

一个按键模拟函数的疑问 [复制链接]

论坛徽章:
0
发表于 2011-07-25 15:14 |显示全部楼层
本帖最后由 c04n05 于 2011-07-25 15:19 编辑

刚才在网上看到了按键模拟程序的一个流程,于是写了下面这段测试小代码:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <linux/input.h>
  4. #include <fcntl.h>
  5. #include <errno.h>

  6. void key_simulate(int fd, int key_value)
  7. {
  8.         struct input_event event;
  9.         event.type = EV_KEY;
  10.         event.code = key_value;
  11.         event.value = 1;
  12.         gettimeofday(&event.time, 0);

  13.         if (write(fd, &event, sizeof(event)) < 0)
  14.         {
  15.                 printf("simulate key error!\n");
  16.                 return;
  17.         }
  18. }

  19. int main()
  20. {
  21.         int fd_kdb = open("/dev/input/event1", O_RDWR);
  22.         if (fd_kdb <= 0)
  23.         {
  24.                 printf("error open keyboard:%s\n", strerror(errno));
  25.                 return -1;
  26.         }
  27.        
  28.         key_simulate(fd_kdb, KEY_L); //模拟按键l
  29.         key_simulate(fd_kdb, KEY_S);//模拟按键s
  30.         key_simulate(fd_kdb, KEY_ENTER);//模拟回车
  31.        
  32.         close(fd_kdb);
  33. }
复制代码
编译完了之后不像我预料中的输出那样执行"ls"命令,而是打印"l"之后无限重复打印"s"。请问这是为啥?

论坛徽章:
0
发表于 2011-07-25 16:16 |显示全部楼层
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <linux/input.h>
  4. #include <fcntl.h>
  5. #include <errno.h>

  6. void key_simulator(int fd, int key_code, int key_state)
  7. {
  8.         struct input_event event;
  9.         event.type = EV_KEY;
  10.         event.code = key_code;
  11.         event.value = key_state;
  12.         gettimeofday(&event.time, 0);

  13.         if (write(fd, &event, sizeof(event)) < 0)
  14.         {
  15.                 printf("simulate key error!\n");
  16.                 return;
  17.         }
  18. }

  19. int main()
  20. {
  21.         int fd_kdb = open("/dev/input/event1", O_RDWR);
  22.         if (fd_kdb <= 0)
  23.         {
  24.                 printf("error open keyboard:%s\n", strerror(errno));
  25.                 return -1;
  26.         }
  27.        
  28.         key_simulator(fd_kdb, KEY_L, 1);
  29.         key_simulator(fd_kdb, KEY_L, 0);
  30.         key_simulator(fd_kdb, KEY_S, 1);
  31.         key_simulator(fd_kdb, KEY_S, 0);
  32.         key_simulator(fd_kdb, KEY_ENTER, 1);
  33.         key_simulator(fd_kdb, KEY_ENTER, 0);
  34.        
  35.         close(fd_kdb);
  36. }
复制代码
是我菜了。。没有模拟弹起。改成了上面这个样子
不过还是没有执行ls命令。输出如下:
ls[root@TM-0166 keyEvent]# ls

论坛徽章:
0
发表于 2011-07-25 21:59 |显示全部楼层
命令只能在shell上执行,光按键有啥用?????????
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP