`
被触发
  • 浏览: 35228 次
文章分类
社区版块
存档分类
最新评论

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);
}


参考:
http://cache.baidu.comc?m=9f65cb4a8c8507ed4fece763104e953f484380146d94975439c3933fc23846000c27feed727458199487223a52f91d07b4a72b72350124b298c98849dbbb942d24892c23706bc40354c75cf28b102a8177ce4de8df0ee0cee733e3e4c5d3ae0a0896144f&p=882a975685cc42a934b4c23f4b47&user=baidu

Linux输入子系统分析
http://www.linuxdriver.cn/html/20079/113.htm


一段linux模拟键盘的demo程序

#include
#include
#include
#include
#include
#include
#include

int simkey(int fd,int value);

int main(void)
{


int fd_kbd;
char c;



if((fd_kbd=open("/dev/input/event1",O_RDWR ))<=0) //ls /dev/input/event1是存在的
{
printf("can not open kbd file !\n");
return -1;
}
if(simkey(fd_kbd,1)<0)
{
printf("No press !\n");
return -1;
}
if(simkey(fd_kbd,0)<0)
{
printf("No release!\n");
return -1;
}

close(fd_kbd);


printf("YES!\n");


return 0;
}
int simkey(int fd,int value)
{
struct input_event event;
event.type=EV_KEY;
event.code=KEY_A; //模拟输入'A'
event.value=value;
gettimeofday(&event.time,0);

if(write(fd,&event,sizeof(event))<0)
{
printf("simulate key error! \n");
return -1;
}

return 0;
}

使用sudo执行即可
分享到:
评论

相关推荐

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

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

    linux 模拟鼠标和按键输入

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

    模拟精灵 轻松录制鼠标键盘动作

    轻松录制鼠标键盘动作、可自由编辑、智能回放运行 真正替代双手、自动化操作鼠标键盘完成指定任务 把一组自动化操作绑定一个热键、扩展键盘功能 自动安装与使用程序、远程协助、制作演示教程 轻松创建功能...

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

    特征鼠标点击鼠标运动(相对和绝对)鼠标滚动(支持平滑滚动)按键将 Unicode 字符转换为按键输入任意 Unicode 字符串获取鼠标位置获取屏幕大小平台Linux - 使用 X11Linux - 没有 X11苹果系统视窗用法将以下内容添加...

    Windows和Linux上的钩子和模拟键盘事件-python

    Windows和Linux上的钩子和模拟键盘事件 键盘 使用这个小型 Python 库完全控制您的键盘。 挂钩全局事件、注册热键、模拟按键等等。 特性 所有键盘上的全局事件挂钩(无论焦点如何都捕获键)。 监听和发送键盘事件...

    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的范围,即鼠标事件,但是我还没有这样做。 随意...

Global site tag (gtag.js) - Google Analytics