`

linux下如何模拟按键输入和模拟鼠标

阅读更多

查看/dev/input/eventX是什么类型的事件, cat /proc/bus/input/devices

设备有着自己特殊的按键键码,我需要将一些标准的按键,比如0-9,X-Z等模拟成标准按键,比如KEY_0,KEY-Z等,所以需要用到按键模拟,具体 方法就是操作/dev/input/event1文件,向它写入个input_event结构体就可以模拟按键的输入了。

linux/input.h中有定义,这个文件还定义了标准按键的编码等

struct input_event {
         struct timeval time; //按键时间
         __u16 type; //类型,在下面有定义
         __u16 code; //要模拟成什么按键
         __s32 value;//是按下还是释放
};
 



code:

事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0~127为键盘上的按键代码,0x110~0x116 为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看include/linux/input.h文件. 如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向REL_X(代码为0x00),指示鼠标的Y轴方向REL_Y(代码 为0x01),指示鼠标中轮子方向REL_WHEEL(代码为0x08).

type:

EV_KEY,键盘

EV_REL,相对坐标

EV_ABS,绝对坐标

value:

事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_ REL,value的正数值和负数值分别代表两个不同方向的值.

/*
* Event types
*/

#define EV_SYN 0x00
#define EV_KEY 0x01 //按键
#define EV_REL 0x02 //相对坐标(轨迹球)
#define EV_ABS 0x03 //绝对坐标
#define EV_MSC 0x04 //其他
#define EV_SW 0x05
#define EV_LED 0x11 //LED
#define EV_SND 0x12//声音
#define EV_REP 0x14//repeat
#define EV_FF 0x15
#define EV_PWR 0x16
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
 



1。模拟按键输入

//其中0表示释放,1按键按下,2表示一直按下

//0 for EV_KEY for release, 1 for keypress and 2 for autorepeat.

void simulate_key(int fd,int value)

{
         struct input_event event;
         event.type = EV_KEY;
         //event.code = KEY_0;//要模拟成什么按键
         event.value = value;//是按下还是释放按键或者重复
         gettimeofday(&event.time,0);
         if(write(fd,&event,sizeof(event)) < 0){
                  dprintk("simulate key error~~~\n");
         return ;
         }
}
 



2。模拟鼠标输入(轨迹球)

void simulate_mouse(int fd,char buf[4])
{
         int rel_x,rel_y;
         static struct input_event event,ev;

         //buf[0],buf[2],小于0则为左移,大于0则为右移
         //buf[1],buf[3],小于0则为下移,大于0则为上移
         dprintk("MOUSE TOUCH: x1=%d,y1=%d,x2=%d,y2=%d\n",buf[0],buf[1],buf[2],buf[3]);

         rel_x = (buf[0] + buf[2]) /2;
         rel_y = -(buf[1] + buf[3]) /2; //和我们的鼠标是相反的方向,所以取反
         event.type = EV_REL;
         event.code = REL_X;
         event.value = rel_x;
         gettimeofday(&event.time,0);

         if( write(fd,&event,sizeof(event))!=sizeof(event))
                  dprintk("rel_x error~~~:%s\n",strerror(errno));
         event.code = REL_Y;
         event.value = rel_y;
         gettimeofday(&event.time,0);

         if( write(fd,&event,sizeof(event))!=sizeof(event))
                   dprintk("rel_y error~~~:%s\n",strerror(errno));
          //一定要刷新空的
         write(fd,&ev,sizeof(ev));
}
 



鼠标和键盘文件打开方法:

         int fd_kbd; // /dev/input/event1
         int fd_mouse; //dev/input/mouse2
         fd_kbd = open("/dev/input/event1",O_RDWR);
         if(fd_kbd<=0){
                  printf("error open keyboard:%s\n",strerror(errno));
         return -1;
         }
         
         fd_mouse = open("/dev/input/event3",O_RDWR); //如果不行的话,那试试/dev/input/mice
         
         if(fd_mouse<=0){
                  printf("error open mouse:%s\n",strerror(errno));
         return -2;
         }
 


/dev/input/mice是鼠标的抽象,代表的是鼠标,也许是/dev/input/mouse,/dev/input/mouse1,或者空,

这个文件一直会存在。

这里你也许会问,我怎么知道/dev/input/eventX这些事件到底是什么事件阿,是鼠标还是键盘或者别的,

eventX代表的是所有输入设备(input核心)的事件,比如按键按下,或者鼠标移动,或者游戏遥控器等等,

在系统查看的方法是 cat /proc/bus/input/devices 就可以看到每个eventX是什么设备的事件了。

PS: 在GTK中用的话,可以参考下gtk_main_do_event这个函数

static void simulate_key(GtkWidget *window,int keyval,int press)
{
         GdkEvent *event;
         GdkEventType type;
         if(press)
                  type = GDK_KEY_PRESS;
         else
                  type = GDK_KEY_RELEASE;

         event = gdk_event_new(type);
         //event->key.send_event = TRUE;
         event->key.window = window->window; //一定要设置为主窗口
         event->key.keyval = keyval;
         
         //FIXME:一定要加上这个,要不然容易出错
         g_object_ref(event->key.window);
         gdk_threads_enter();
         //FIXME: 记得用这个来发送事件
         gtk_main_do_event(event);
         gdk_threads_leave();
         gdk_event_free(event);

}

 

Qutoe

 

分享到:
评论

相关推荐

    linux下如何模拟按键输入和模拟鼠标.doc

    linux下如何模拟按键输入和模拟鼠标.doc

    linux 模拟鼠标和按键输入

    linux下的操作鼠标和键盘的操作,c语言编写,很值得参考的系统编程资料

    用于模拟鼠标和键盘事件的库

    胖控制器TFC 是一个用于模拟鼠标和键盘事件的库。这个库是为TFC-server使用而构建的,TFC-server是一个允许通过移动应用程序远程控制 PC 的服务器。特征鼠标点击鼠标运动(相对和绝对)鼠标滚动(支持平滑滚动)按键...

    linux 虚拟键盘驱动

    驱动 可以通过向设备文件里 模拟鼠标 键盘的输入;这个是实际项目中用到的基本版本,如果需要其他的按键可以自己扩展;学习交流

    Linux编程从入门到精通

    10.4.3 Linux下的进程控制 312 10.5 可移植条件编译 313 10.6 补充说明 314 附录 以字母顺序排列的系统调用 315 第四部分 Linux内核概念系统结构 摘要 323 前言 324 第1章 系统结构 325 1.1 系统概述 325 1.2 内核的...

    LINUX编程白皮书 (全集)

    10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux信号选项 310 10.2.3 Linux下的信号 310 10.2.4 Linux支持的信号 311 10.3 终端I/O 311 10.4 进程信息和控制 311 10.4.1 kvm过程 312 10.4.2 ptrace和/proc...

    linux编程白皮书

    对深入研究Linux下的编程有很大的帮助。 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 ...

    《精通Linux 设备驱动程序开发》.(Sreekrishnan).pdf

    全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深入探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如pcmcia、i2c和usb等外部总线以及视频、音频、无线连网和闪存等驱动程序的开发,并讲解了相关的...

    精通LINUX设备驱动程序开发

    144 7.2 输入设备驱动程序 150 7.2.1 serio 150 7.2.2 键盘 150 7.2.3 鼠标 152 7.2.4 触摸控制器 157 7.2.5 加速度传感器 158 7.2.6 输出事件 158 7.3 调试 159 7.4 查看源代码 160 第8章 i2c协议 161 ...

    LINUX编程白皮书

    对深入研究Linux下的编程有很大的帮助。 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 ...

    Linux编程白皮书

    10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux信号选项 310 10.2.3 Linux下的信号 310 10.2.4 Linux支持的信号 311 10.3 终端I/O 311 10.4 进程信息和控制 311 10.4.1 kvm过程 312 10.4.2 ptrace和/proc...

    Linux编程资料

    10.2.1 SVR4、BSD和POSIX.1下 的信号 310 10.2.2 Linux信号选项 310 10.2.3 Linux下的信号 310 10.2.4 Linux支持的信号 311 10.3 终端I/O 311 10.4 进程信息和控制 311 10.4.1 kvm过程 312 10.4.2 ptrace和/proc...

    gostwriter:用于Linux的虚拟键盘,它利用devuinput注入键事件

    以编程方式模拟用户的击键,即可以映射到键盘输入的模拟游戏板或其他设备。 ## Limitations目前仅执行键盘事件,到目前为止仅执行我需要的事件。 可以扩展到uinput的范围,即鼠标事件,但是我还没有这样做。 随意...

    入门学习Linux常用必会60个命令实例详解doc/txt

    这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台...

Global site tag (gtag.js) - Google Analytics