linux usb 鼠标 模拟,使用uinput模拟Linux中的绝对鼠标移动

我正在尝试使用绝对坐标移动光标.这是代码:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define die(str,args...) do { \

perror(str); \

exit(EXIT_FAILURE); \

} while(0)

int fd;

static void signal_handler(int signo)

{

printf("\nCaught SIGINT\n");

if(ioctl(fd,UI_DEV_DESTROY) < 0)

die("error: cannot destroy uinput device\n");

else printf("Destroyed uinput_user_dev\n\n");

close(fd);

exit(EXIT_SUCCESS);

}

int

main(void)

{

struct uinput_user_dev uidev;

struct input_event ev;

int x,y;

int i;

if(signal(SIGINT,signal_handler)==SIG_ERR)

{

printf("error registering signal handler\n");

exit(EXIT_FAILURE);

}

fd = open("/dev/uinput",O_WRONLY | O_NONBLOCK);

if(fd < 0)

die("error: open");

if(ioctl(fd,UI_SET_EVBIT,EV_KEY) < 0)

die("error: ioctl");

// if(ioctl(fd,UI_SET_KEYBIT,BTN_MOUSE) < 0)

// die("error: ioctl");

if(ioctl(fd,BTN_LEFT) < 0)

die("error: ioctl");

if(ioctl(fd,BTN_RIGHT) < 0)

die("error: ioctl");

if(ioctl(fd,EV_REL) < 0)

die("error: ioctl");

if(ioctl(fd,UI_SET_RELBIT,REL_X) < 0)

die("error: ioctl");

if(ioctl(fd,REL_Y) < 0)

die("error: ioctl");

if(ioctl(fd,EV_ABS) < 0)

die("error: ioctl");

if(ioctl(fd,UI_SET_ABSBIT,ABS_X) < 0)

die("error: ioctl");

if(ioctl(fd,ABS_Y) < 0)

die("error: ioctl");

memset(&uidev,sizeof(uidev));

snprintf(uidev.name,UINPUT_MAX_NAME_SIZE,"uinput-sample");

uidev.id.bustype = BUS_USB;

uidev.id.vendor = 0x1;

uidev.id.product = 0x1;

uidev.id.version = 1;

uidev.absmin[ABS_X]=0;

uidev.absmax[ABS_X]=1023;

uidev.absfuzz[ABS_X]=0;

uidev.absflat[ABS_X ]=0;

uidev.absmin[ABS_Y]=0;

uidev.absmax[ABS_Y]=767;

uidev.absfuzz[ABS_Y]=0;

uidev.absflat[ABS_Y ]=0;

if(write(fd,&uidev,sizeof(uidev)) < 0)

die("error: write0");

if(ioctl(fd,UI_DEV_CREATE) < 0)

die("error: ioctl");

sleep(2);

while(1)

{

printf("\nEnter the absoulte x(0-1023) and y(0-767) co-ordinates:");

scanf("%d %d",&x,&y);

memset(&ev,sizeof(struct input_event));

gettimeofday(&ev.time,NULL);

ev.type = EV_ABS;

ev.code = ABS_X;

ev.value = x;

if(write(fd,&ev,sizeof(struct input_event)) < 0)

die("error: write1");

memset(&ev,sizeof(struct input_event));

ev.type = EV_SYN;

if(write(fd,sizeof(struct input_event)) < 0)

die("error: write4");

memset(&ev,sizeof(struct input_event));

ev.type = EV_ABS;

ev.code = ABS_Y;

ev.value = y;

if(write(fd,sizeof(struct input_event)) < 0)

die("error: write2");

memset(&ev,sizeof(struct input_event)) < 0)

die("error: write3");

usleep(15000);

printf("\nWritten x:%d y:%d to uinput.Press CTRL-C to quit:",x,y);

}

if(ioctl(fd,UI_DEV_DESTROY) < 0)

die("error: cannot destroy uinput device\n");

close(fd);

return 0;

}

该程序似乎通过uinput将我输入的绝对坐标发送到内核的输入核心.

在启用evbug之后,我在dmesg上验证了这一点.但我的鼠标指针不会在屏幕上移动.我想知道我搞砸了什么.

也许EV_ABS与光标无关?我想知道因为使用EV_REL移动光标可以正常工作,如this tutorial所述.

样品运行:

ravi@linux-lxaf:~/workspace/driver> sudo ./a.out

Enter the absoulte x(0-1023) and y(0-767) co-ordinates:100 200

Written x:100 y:200 to uinput.Press CTRL-C to quit:

Enter the absoulte x(0-1023) and y(0-767) co-ordinates:10 765

Written x:10 y:765 to uinput.Press CTRL-C to quit:

Enter the absoulte x(0-1023) and y(0-767) co-ordinates:^C

Caught SIGINT

Destroyed uinput_user_dev

Dmesg输出:

ravi@linux-lxaf:~/workspace/driver> dmesg |grep input16

[ 4750.660420] input: uinput-sample as /devices/virtual/input/input16

[ 4750.660594] evbug.c: Connected device: input16 (uinput-sample at unknown)

[ 4761.389036] evbug.c: Event. Dev: input16,Type: 3,Code: 0,Value: 100

[ 4761.389047] evbug.c: Event. Dev: input16,Type: 0,Value: 0

[ 4761.389053] evbug.c: Event. Dev: input16,Code: 1,Value: 200

[ 4761.389058] evbug.c: Event. Dev: input16,Value: 0

[ 4776.893126] evbug.c: Event. Dev: input16,Value: 10

[ 4776.893138] evbug.c: Event. Dev: input16,Value: 0

[ 4776.893144] evbug.c: Event. Dev: input16,Value: 765

[ 4776.893148] evbug.c: Event. Dev: input16,Value: 0

[ 4778.729711] evbug.c: Event. Dev: input16,Value: 1

[ 4778.745506] evbug.c: Disconnected device: input16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux实现读写HID模拟鼠标可以通过以下步骤来完成: 1. 首先,需要使用hidraw设备来读写HID设备。HID设备在Linux通常以hidraw设备的形式出现。可以通过以下命令查看系统的hidraw设备: ```shell ls /dev/hidraw* ``` 2. 打开hidraw设备以进行读写操作。可以使用C语言编写一个程序来打开hidraw设备,并使用read和write函数来读写数据。以下是一个简单的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <linux/hidraw.h> int main() { int fd; char buf[8]; fd = open("/dev/hidraw0", O_RDWR); if (fd < 0) { perror("Unable to open hidraw device"); exit(1); } // 读取数据 if (read(fd, buf, sizeof(buf)) < 0) { perror("Unable to read from hidraw device"); exit(1); } // 写入数据 if (write(fd, buf, sizeof(buf)) < 0) { perror("Unable to write to hidraw device"); exit(1); } close(fd); return 0; } ``` 3. 解析HID报文。HID报文通常是由一系列的字节组成的。根据HID规范,可以解析报文的每个字节来获取鼠标的相关信息,例如鼠标的坐标、按键状态等。 4. 模拟鼠标操作。根据解析得到的鼠标信息,可以使用X11或者uinput模拟鼠标操作。X11是Linux下的图形系统,可以使用XTest库来模拟鼠标操作。uinputLinux内核提供的一个虚拟输入设备接口,可以使用uinput库来模拟鼠标操作。 以下是一个使用XTest库来模拟鼠标操作的示例程序: ```c #include <stdio.h> #include <X11/Xlib.h> #include <X11/extensions/XTest.h> int main() { Display *display; Window root; XEvent event; display = XOpenDisplay(NULL); if (display == NULL) { fprintf(stderr, "Unable to open display\n"); return 1; } root = DefaultRootWindow(display); // 模拟鼠标移动 XTestFakeMotionEvent(display, -1, 100, 100, CurrentTime); // 模拟鼠标点击 XTestFakeButtonEvent(display, 1, True, CurrentTime); XTestFakeButtonEvent(display, 1, False, CurrentTime); XFlush(display); XCloseDisplay(display); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值