linux下鼠标键盘按键的模拟

本文介绍如何在Linux下模拟鼠标和键盘输入。通过分析/dev/input目录下的设备文件,如event和mice,找到对应输入设备,并利用特定数据格式向设备文件写入数据来实现模拟输入。文章探讨了event结构体定义以及为何选择event而非mice进行模拟,并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段时间写了一个windows下远程监控linux的软件,其中一个最核心的问题就是按键的模拟

windows下发送按键信号,linux下接收后然后模拟标准键盘输入


linux下有一个文件夹  /dev/input  ,包含了Linux下所有的输入设备  

我们用ls /dev/input 可以查看Linux下所有输入设备,比如说 event1 event2  mice 等等..

如果我们使用cat命令 cat /dev/input/mice 会发现这是个空文件,如果我们移动鼠标,然后终端下会显示写乱码,让我们停止鼠标输出就会结束


同学们可以把input文件夹下的所有文件一个一个的用cat命令打开,点击鼠标或者键盘  如果发现有乱码在终端上输出,很有可能你就找到了对应此文件的设备。

其实查找这些设备是可以通过另外一种方式  :   cat /proc/bus/input/devices  

其结果详细介绍了哪个event设备文件对应着哪个实际的设备 具体结果就不显示了,希望大家自己动手操作


其Linux下的鼠标键盘输入就是通过向这些设备文件写入具有特定格式的数据来实现鼠标键盘输入的效果的、


于是,我们便可以模拟这些数据格式来模拟输入


输入设备有几种文件  event、  mouse 、 mice  等

这些设备没见没有固定的数量,如果你装一个手写板,这里会有会出现一个手写板的设备文件,驱动就是通过增加这些设备文件来空着设备的,不过驱动级的Linux没哟研究过,没法给读者提供更多的知识

event  是键盘鼠标发生的事件,其数据格式linux下  linux/input.h有着详细的定义,我们可以通过event这个来模拟鼠标键盘输入,具体方法往下看

event的结构体定义如下

struct input_event {
struct timeval time;//事件发生时间
__u16 type;  //事件类型
__u16 code;  //事件码
__s32 value;  //事件值
};



mouse  是鼠标 (没搞明白,反正是鼠标)

mice   是鼠标的集合,所有鼠标事件都会发送到这个文件里面的  并且他的存储的数据格式和event的不一样  所以我们不能通过mice来实现我们的目的



比如,我们发现event1是控制键盘输入的,event3是控制键盘输入的

下面的代码则详细的完成了鼠标键盘模拟:



control.h


/*
*  auther: braverior
*  date:2013/3/31
*  http://blog.youkuaiyun.com/braverior
*  mail: braverior@gmail.com
*/

#ifndef _CONTROL_H_
#define _CONTROL_H_
#include<linux/input.h>

#define KEYBOARD "/dev/input/event1"
#define MOUSE "/dev/input/event3"


void move_mouse(int fd,int x,int y);
void keydown(int fd,int key);
void keyup(int fd,int key);
void mousekeydown(int fd,int key);
void mousekeyup(int fd,int key);
int initkeyboard(const char* keyboard);
int initmouse(const char* mouse);


#endif

#include "control.h";


void move_mouse(int fd,int x,int y)
{
        struct input_event event,ev;
        memset(&event, 0, sizeof(event));
        gettimeofday(&event.time, NULL);
        event.type = EV_REL;
        event.code = REL_X;
        event.value = x;
        int len = write(fd, &event, sizeof(event));
        if(len != sizeof(struct input_event))
        {
            printf("error to write\n");
            exit();
        }
        event.type = EV_REL;
        event.code = REL_Y;
        event.value = y;
        len = write(fd, &event, sizeof(event));
        if(len != sizeof(struct input_event))
        {
            printf("error to write2\n");
            exit();
        }
        event.type = EV_SYN;
        event.code = SYN_REPORT;
        event.value = 0;
        len = write(fd, &event, sizeof(event));
        if(len != sizeof(struct input_event))
        {
            printf("error to write3\n");
            exit();
        }

}

void keydown(int fd,int key)
{
    struct input_event event;
    event.type = EV_MSC;
    event.code = 4;
    event.value = key;
    gettimeofday(&event.time,0);
    if(write(fd,&event,sizeof(event)) < 0)
    {
         printf("error open keyboard:%s\n",strerror(errno));
         exit();
    }

    event.type = EV_KEY;
    event.code = key;
    event.value = 1;
    gettimeofday(&event.time,0);
    if(write(fd,&event,sizeof(event)) < 0)
    {
         printf("error open keyboard:%s\n",strerror(errno));
        exit();
    }
    event.type = EV_SYN;
    event.code = 0;
    event.value = 0;
    gettimeofday(&event.time,0);
    if(write(fd,&event,sizeof(event)) < 0)
    {
         printf("error open keyboard:%s\n",strerror(errno));
        exit();
    }

}
void keyup(int fd,int key)
{
     struct input_event event;
    event.type = EV_MSC;
    event.code = 4;
    event.value = key;
    gettimeofday(&event.time,0);
    if(write(fd,&event,sizeof(event)) < 0)
    {
        printf("error open keyboard:%s\n",strerror(errno));
        exit();
    }

    event.type = EV_KEY;
    event.code = key;
    event.value = 0;
    gettimeofday(&event.time,0);
    if(write(fd,&event,sizeof(event)) < 0)
    {
        printf("error open keyboard:%s\n",strerror(errno));
        exit();
    }
    event.type = EV_SYN;
    event.code = 0;
    event.value = 0;
    gettimeofday(&event.time,0);
    if(write(fd,&event,sizeof(event)) < 0)
    {
        printf("error open keyboard:%s\n",strerror(errno));
        exit();
    }
}
void mousekeydown(int fd,int key)
{
    struct input_event event,ev;
    memset(&event, 0, sizeof(event));
    memset(&ev, 0, sizeof(ev));
    gettimeofday(&event.time, NULL);
    event.type = EV_KEY;
    event.code = key;
    event.value = 1;
    int len = write(fd, &event, sizeof(event));
    if(len  != sizeof(struct input_event))
    {
        printf("error in write1\n");
        exit();
    }
    event.type = EV_REL;
    event.code = 0;
    event.value = 1;
    write(fd, &event, sizeof(event));
    if(len  != sizeof(struct input_event))
    {
        printf("error in write2\n");
        exit();
    }
     event.type = EV_REL;
    event.code = 1;
    event.value = 1;
    write(fd, &event, sizeof(event));
    if(len  != sizeof(struct input_event))
    {
        printf("error in write2\n");
        exit();
    }

    write(fd,(char *)&ev,sizeof(struct input_event));
    if(len  != sizeof(struct input_event))
    {
        printf("error in write\n");
        exit();
    }


}
void mousekeyup(int fd,int key)
{
    struct input_event event,ev;
    memset(&event, 0, sizeof(event));
    memset(&ev, 0, sizeof(ev));
    gettimeofday(&event.time, NULL);
    event.type = EV_KEY;
    event.code = key;
    event.value = 0;
    int len = write(fd, &event, sizeof(event));
    if(len  != sizeof(struct input_event))
    {
        printf("error in write1\n");
        exit();
    }
    event.type = EV_REL;
    event.code = 0;
    event.value = 1;
    write(fd, &event, sizeof(event));
    if(len  != sizeof(struct input_event))
    {
        printf("error in write\n");
        exit(); 
    }
     event.type = EV_REL;
    event.code = 1;
    event.value = 1;
    write(fd, &event, sizeof(event));
    if(len  != sizeof(struct input_event))
    {
        printf("error in write\n");
        exit();
    }

    write(fd,(char *)&ev,sizeof(struct input_event));
    if(len  != sizeof(struct input_event))
    {
        printf("error in write3\n");
        exit();
    }
}
int initkeyboard(const char* keyboard)
{
    int fd;
    fd = open(keyboard,O_RDWR);
    if(fd) return fd;
    return 0;
}
int initmouse(const char* mouse)
{
    int fd;
    fd = open(mouse,O_RDWR);
    if(fd) return fd;
    return 0;
}




int main()
{
    int fd_keyboard = initkeyboard(KEYBOARD);
    sleep(3);
    keydown(fd_keyboard,KEY_A);
    keyup(fd_keyboard,KEY_A);
    int fd_mouse = initmouse(MOUSE);
    move_mouse(fd_mouse,200,-200);
    printf("read to press key\n");
    printf("read to press mouse left key\n");
    sleep(3);
    mousekeydown(fd_mouse,BTN_LEFT);//左键按下
    mousekeyup(fd_mouse,BTN_LEFT);  //左键弹起
    printf("read to press mouse right key\n");
    sleep(3);
    mousekeydown(fd_mouse,BTN_RIGHT);//右键按下
    mousekeyup(fd_mouse,BTN_RIGHT);  //右键弹起
    //这里没有写close(fd);等操作。其实我不知道是自己系统的问题还是什么,一旦有这些关闭fd操作的鼠标键盘便会失去控制,希望大家看完这些代码后测试一下,如果可以的额话可以评论,可以邮件,谢谢。
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值