Linux 模拟 鼠标 键盘 事件

/************************************************************************
 *                      Linux 模拟 鼠标 键盘 事件
 * 说明:
 *     以前看到有些软件能够控制鼠标移动,键盘操作等功能,总想知道这些到底
 * 是怎么做到的,好像是2年前也尝试去做这件事,但那时候对知识的匮乏直接导致
 * 无法进行,早上突然想到这件事,于是又搜索了一下,鉴于目前经常接触Linux
 * 驱动,对这些东西的理解也就很容易。
 *
 *                                     2016-2-27 深圳 南山平山村 曾剑锋
 ***********************************************************************/

一、参考文章:
    1. 交互系统的构建之(二)Linux下鼠标和键盘的模拟控制
        http://blog.csdn.net/zouxy09/article/details/7920253
    2. 在Linux中模拟击键和鼠标移动
        http://os.51cto.com/art/201409/450283.htm

二、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/input1
    U: Uniq=
    H: Handlers=sysrq kbd event1        ---> keyboard
    B: PROP=0
    B: EV=120013
    B: KEY=402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe
    B: MSC=10
    B: LED=7
    ......
    I: Bus=0003 Vendor=0e0f Product=0003 Version=0110
    N: Name="VMware VMware Virtual USB Mouse"
    P: Phys=usb-0000:02:00.0-1/input1
    S: Sysfs=/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-1/2-1:1.1/input/input3
    U: Uniq=
    H: Handlers=mouse1 event3           ---> mouse
    B: PROP=0
    B: EV=17
    B: KEY=ffff0000 0 0 0 0
    B: REL=143
    B: MSC=10
    ......

三、权限修改:
    [email protected]:/dev/input$ ls -al
    total 0
    drwxr-xr-x  4 root root    280 Feb 27 08:49 .
    drwxr-xr-x 15 root root   4260 Feb 27 08:49 ..
    drwxr-xr-x  2 root root    120 Feb 27 08:49 by-id
    drwxr-xr-x  2 root root    180 Feb 27 08:49 by-path
    crw-r-----  1 root root 13, 64 Feb 27 08:49 event0
    crw-r-----  1 root root 13, 65 Feb 27 08:49 event1
    crw-r-----  1 root root 13, 66 Feb 27 08:49 event2
    crw-r-----  1 root root 13, 67 Feb 27 08:49 event3
    crw-r-----  1 root root 13, 68 Feb 27 08:49 event4
    crw-r--r--  1 root root 13,  0 Feb 27 08:49 js0
    crw-r-----  1 root root 13, 63 Feb 27 08:49 mice
    crw-r-----  1 root root 13, 32 Feb 27 08:49 mouse0
    crw-r-----  1 root root 13, 33 Feb 27 08:49 mouse1
    crw-r-----  1 root root 13, 34 Feb 27 08:49 mouse2
    [email protected]:/dev/input$ sudo chmod 666 * 

四、example code:
    #include <stdio.h>
    #include <linux/input.h>
    #include <fcntl.h>
    #include <sys/time.h>
    #include <unistd.h>
    #include <string.h>

    //按键模拟,按键包含按下和松开两个环节
    void simulate_key(int fd, int kval)
    {
        struct input_event event;
        gettimeofday(&event.time, 0);

        //按下kval键
        event.type = EV_KEY;
        event.value = 1;
        event.code = kval;
        write(fd, &event, sizeof(event));

        //同步,也就是把它报告给系统
        event.type = EV_SYN;
        event.value = 0;
        event.code = SYN_REPORT;
        write(fd, &event, sizeof(event));

        memset(&event, 0, sizeof(event));
        gettimeofday(&event.time, 0);

        //松开kval键
        event.type = EV_KEY;
        event.value = 0;
        event.code = kval;
        write(fd, &event, sizeof(event));

        //同步,也就是把它报告给系统
        event.type = EV_SYN;
        event.value = 0;
        event.code = SYN_REPORT;
        write(fd, &event, sizeof(event));
    }

    //鼠标移动模拟
    void simulate_mouse(int fd, int rel_x, int rel_y)
    {
        struct input_event event;
        gettimeofday(&event.time, 0);

        //x轴坐标的相对位移
        event.type = EV_REL;
        event.value = rel_x;
        event.code = REL_X;
        write(fd, &event, sizeof(event));

        //y轴坐标的相对位移
        event.type = EV_REL;
        event.value = rel_y;
        event.code = REL_Y;
        write(fd, &event, sizeof(event));

        //同步
        event.type = EV_SYN;
        event.value = 0;
        event.code = SYN_REPORT;
        write(fd, &event, sizeof(event));
    }

    int main(int argc, char **argv)
    {
        int fd_mouse = -1;
        int fd_kbd = -1;
        int i = 0;

        // 请保证该设备节点有写的权限
        fd_kbd = open("/dev/input/event1", O_RDWR);
        if(fd_kbd <= 0) {
            printf("Can not open keyboard input file\n");
            return -1;
        }

        // 请保证该设备节点有写的权限
        fd_mouse = open("/dev/input/event3", O_RDWR);
        if(fd_mouse <= 0) {
            printf("Can not open mouse input file\n");
            return -1;
        }

        for (i = 0; i < 50; i++) {
            //simulate_key(fd_mouse, BTN_LEFT);   //模拟按下鼠标左键
            //simulate_key(fd_mouse, BTN_RIGHT);  //模拟按下鼠标左键
            if (i % 3 == 0)
                simulate_key(fd_kbd, KEY_A);    //模拟按下键盘A键
            //模拟鼠标相对上次x和y轴相应移动10个像素
            //simulate_mouse(fd_mouse, 20, 20);
            sleep(1);
        }

        close(fd_kbd);
        close(fd_mouse);
    }
时间: 2024-10-08 13:20:38

Linux 模拟 鼠标 键盘 事件的相关文章

由chrome剪贴板问题研究到了js模拟鼠标键盘事件

写在前面 最近公司在搞浏览器兼容的事情,所有浏览器兼容的问题不得不一个人包了.下面来说一下今天遇到的一个问题吧 大家都知道IE下面如果要获得剪贴板里面的信息的话,代码应该如下所示 window.clipboardData.getData("Text") 可是在chrome下面就行不通了,chrome下面没有类似ie的这种方法,那应该怎么办呢,百度了一下,发现还真有办法. 只要在HTML界面上放上一个text类型的控件,如下所示 <textarea id="textAre

使用python监听、模拟鼠标键盘事件

最近守望职业选手疑似开挂事件挺热闹的,在下小菜一枚,并不能从视频中看出端倪.看了一些关于外挂的讨论,自动点射和压枪只需在鼠标驱动上做些改动即可,自瞄或其他高级功能则需要读内存或修改游戏文件,检测也更容易. 士兵76长按左键扫射4发子弹之后准星就会小范围随机飘,所以想自己实现一个长按左键变自动点射的程序. 仅作测试使用,鄙视一切外挂,玩游戏就好好玩. 选择使用python,用到的库pyHook,pywin32 pyHook的文档:http://pyhook.sourceforge.net/doc_

Python - selenium_WebDriver 鼠标键盘事件

from selenium import webdriver #引入ActionChains类 提供了鼠标的操作方法 from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from ReadTxt_demo import readTxt import time #鼠标键盘事件 ''' ActionChains 常用方法 per

Delphi下利用WinIo模拟鼠标键盘详解

http://www.cnblogs.com/rogee/archive/2010/09/14/1827248.html 本文最早在编程论坛上发表,文章地址:http://programbbs.com/bbs/view12-17207-1.htm,相关文件可以在上述地址的页面中下载.转载时请注明出处. 前言 一日发现SendInput对某程序居然无效,无奈只好开始研究WinIo.上网查了很多资料,发现关于WinIo模拟鼠标键盘的资料很少,有的也只是支言片语讲的不是很详细,而且大部分都是关于模拟键

selenium鼠标键盘事件(转)

概念 在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作.在 WebDeriver 中,有一个专门的类来负责实现这些测试场景,那就是 Actions 类,在使用该类的过程中会配合使用到 Keys 枚举以及 Mouse. Keyboard.CompositeAction 等类. 其次,在实际测试过程中,可能会遇到某些按键没办法使用 Actions.Keys

模拟鼠标键盘操作,含硬件模拟技术[转载]

键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作.但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件.那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制.    当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机.如

做UI最全的鼠标键盘事件!

在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作.在 WebDeriver 中,有一个专门的类来负责实现这些测试场景,那就是ActionChains类,在使用该类做键盘操作的过程中会配合使用到 Keys 数据存储类,Keys包含键盘上所有特殊按键. 一.鼠标点击操作 click(element=None)左击context_click(element=N

转:WebDriver(Selenium2)模拟鼠标经过事件

在自动化测试过程中,由于javascript的使用,我们常常需要点击一些鼠标经过显示的菜单等元素,这时需要触发该元素的鼠标经过事件.使用WebDriver有以下两种实现. 1.使用Action Java代码   public void moveToElement(WebDriver driver, By locator) { Actions builder = new Actions(driver); builder.moveToElement(driver.findElement(locato

C#模拟鼠标键盘控制其他窗口(一)

编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口.比如,操作飞信定时发送短信等.我之前开发过飞信耗子,用的是对飞信协议进行抓包,然后分析协议,进而模拟协议的执行,开发出了客户端,与移动服务器进行通信,但是这有一些缺点.如果移动的服务器对接口进行变更,我所编写的客户端也要进行相应的升级.如果服务器的协议进行了更改,甚至个人编写的这种第三方客户端需要重写.而我个人也没有这个时间和精力,或者说没有足够的利益支撑我继续去重构飞信耗子.因此,这款还算优秀的软件,现在就束之