linux下鼠标键盘网络通信,:Linux下鼠标和键盘的模拟控制(一)

交互式系统的构建(二) Linux下的鼠标和键盘的模拟控制本文将完成:Linux下的鼠标和键盘的模拟控制,即该服务的一部分鼠标键盘的手势和语音控制关于此内容系统结构的文章结构将分为三个部分,一个是功能模块的介绍和在Linux下的简单应用程序的实现;另一个是集成的功能。功能模块进入交互式系统(基于TLD);第三步是分析当前问题和未来解决方案一、输入子系统和模拟程序编写:Linux输入子系统是用于管理各种输入设备(键盘,鼠标)的Linux内核。 ,,写字板等))。输入子系统分为三个部分:输入核心,驱动程序事件处理程序。常规路径是从基础硬件到驱动程序,从驱动程序到输入核心,从输入核心事件处理程序,从事件处理程序到用户空间。让我们这样说:如果没有这个输入子系统,如果我们用键盘按一个键A,则键盘将有一个linux设备驱动程序文件。如果它是/ dev / keyboard,则我们的用户空间应用程序将打开并访问此设备文件/ dev / keyboard,该应用程序将轮询该文件,一旦您按A键,它将返回到用户程序,提示您按了密钥A。

然后,如果存在输入子系统,我们的用户空间应用程序将不会直接打开并访问键盘的设备驱动程序文件,而是访问由键盘驱动程序在输入子系统中注册的事件文件,例如/ dev /输入/事件3,对于键盘驱动程序,足以实现输入系统提供的接口。当按键被按下时,它被发送到输入子系统。不再与用户空间应用程序直接面对面。这样,为驱动程序和应用程序统一接口非常方便,并且同一接口也适用于管理多个硬件。似乎一个非常简单的问题对我来说很冗长,我不知道自己是否犯了错误,哈哈。该输入子系统可以轻松地使我们在用户空间中模拟鼠标和键盘事件。例如,您可以编写一个应用程序以将A写入输入子系统的/ dev / input / event3设备文件(假设这是一个键盘设备文件),这等效于通过键盘按A,并且此A正确系统的任何当前活动窗口均有效(已捕获)。要实现此功能,我们需要回答以下问题:1、我应该写入哪个设备文件?这样可以检查哪些设备文件用于键盘,哪些设备用于鼠标。只有找到这些设备文件后,我们才能通过应用程序打开和写入键值(或鼠标控制信息)。通过#cat / proc / bus / input / devices,您可以查看当前输入子系统下的所有事件设备,并且我们可以找到鼠标和键盘。

例如:Bus = 0003Vendor = 046d Product = c018 Version = 0111 Handlers = mouse1event2 REL = 103您可以在上面的Name处看到此鼠标设备,然后在相应的句柄Handlers event2上看到它。 2、如何编写:每个人都知道,Linux下的所有内容都是文件,因此对于文件操作,我们只需要:open()和write()。 3、写什么(键值编码):它在/usr/include/linux/input.h中定义。该文件定义了事件结构,API和标准密钥编码等;我们需要填写要写入结构的键控代码,然后将其写入键盘或鼠标的事件设备驱动程序文件中。输入事件的结构:struct input_event structtimeval time; //关键时间__u16类型; //事件的类型__u16代码; //模拟__s32值的键;标准键代码:(仅列表部分)类型:事件类型:EV_KEY,键事件,例如键盘键(按下该键),鼠标的左右按钮(EV_REL,相对坐标,主要指鼠标移动事件(相对位移); EV_ABS,绝对坐标,主要是指触摸屏的移动事件,但似乎无法在鼠标上使用,这意味着无法通过此方法获得鼠标的绝对坐标(鼠标为相对位移装置)。

code:事件代码:如果事件类型代码为EV_KEY,则该代码代码为设备键盘代码。代码0〜127是键盘上的键控代码,0x110〜0x116是鼠标上的键控代码,其中0x110(BTN_LEFT)是鼠标左键,0x111(BTN_RIGHT)是鼠标右键,0x112(BTN_MIDDLE)是鼠标中键。有关其他代码的含义,请参考include / linux / input.h文件。相应的宏将在此文件中定义,以表示不同的键。如果事件的类型代码为EV_REL,则代码值指示轨道的类型。例如,指示鼠标REL_X的X轴方向(代码0x0 0),指示鼠标REL_Y的Y轴方向,指示鼠标REL_WHEEL的滚轮方向。)value:事件的值:如果类型代码事件的类型为EV_KEY,当按下按钮时该值为1,该值是事件被释放时的值。如果事件的类型代码为EV_REL,则该值的正负表示值in两个不同的方向,例如,如果代码为REL_X并且值为10,则表示鼠标相对于上一个坐标,在x轴上向右移动10个像素,这是一个模拟鼠标和键盘事件的简单程序在Linux下编写的:#include #include #include #include #include //按键模拟,按键包含按下并释放两个链接void Simulation_key(int fd,int kval)structinput_event event; gettimeofday(&event.time,EV_KEY; event.value kval; write(fd,&event,sizeof(event)); //同步报告给系统ev ent.type EV_SYN; event.value SYN_REPORT; write(fd,&event,sizeof(event)); memset(&event,sizeof(event)); gettimeofday(&event.time,EV_KEY; event.value kval; write(fd,&event,sizeof(event)); //同步,即将其报告给系统event.type EV_SYN; event.value SYN_REPORT; write(fd,&event,sizeof(event)); //鼠标运动模拟void Simulation_mouse(int fd,int rel_x,int rel_y)structinput_event event; gettimeofday(&event.time,轴坐标的相对位移event.type EV_REL; event.value rel_x; event.code REL_X; write(fd,&event,sizeof(event));轴坐标的相对位移event.type EV_REL; event.valu e rel_y; event.code REL_Y; write(fd,&event,sizeof(event)); //同步event.type EV_SYN; event.value SYN_REPORT; write(fd,&event,sizeof(event)); intmain(int argc,char ** argv)intfd_mouse -1 ; int fd_kbd -1; int open(“ / dev / input / event3”,O_RDWR); if(fd_kbd openkeyboard输入文件\ n“);返回-1; open(” / dev / input / event2“,O_RDWR); if(fd_mouse openmouse输入文件\ n“);返回-1; Simulation_key(fd_mouse,BTN_LEFT); //模拟pres使用鼠标左键Simulation_key(fd_kbd,KEY_A); //模拟按下键盘A轴相应地移动10个像素// simulate_mouse(fd_mouse,10,1 0); sleep(3); close(fd_kbd); close(fd_mouse);)那么如何模拟组合键?实际上,按下键盘的过程与每个人都一样,我们可以使用该程序来模拟该过程。

d844daa69389ab42ea7306a274f8f151.png

使用CTRL //首先发送一个CTRL按下事件//发送另一个SPACE按下事件//然后发送一个SPACE释放事件//发送另一个CTRL释放事件。注意每个步骤的发送需要同步一次。 二、集成到交互式系统中(首先基于TLD)。这是因为不需要涉及到某些库的其他链接,因此集成变得非常简单。只需要修改run_tld.cpp:1、添加不在run_tld.cpp中但是对于键的模拟是必需的头文件:#include 2、复制两个函数simulate_key()和simulate_mouse的实现()to run_tld.cpp在主要功能的前面。然后添加tld.init(last_gray,box,bb_file);: //在这里添加孝义int fd_kbd -1; int fd_mouse -1; int open_success open(“ / dev / input / event3”,O_RDWR); if(fd_kbd openkeyboard输入文件\ n“); open_success open(” / dev / input / event2“,O_RDWR); if(fd_mouse openmouse输入文件\ n”); open_success 3、在TLD跟踪框之后,跟踪框。框的位移和前一帧的框。如果位移大于2个像素(以避免抖动),则鼠标将移动8倍像素距离。

pbox是在当前帧中跟踪的目标框,tbox是我自己定义的,用于存储在前一帧中跟踪的目标框tld.processFrame(last_gray,current_gray,pts1,pts2,pbox,status,tl,bb_file ); //绘制点drawPoints(frame,pts 1); drawPoints(frame,pts2,Scalar(0,255,0)); drawBox(frame,pbox); detections ++; //这里添加了xiaoyi x_pixel_move =(int)((tbox .x pbox.width)/ 2); y_pixel_move =(int)((pbox.y y_pixel_move); tbox pbox; //以下部分用于测试手何时快速上下移动,向左和向右发送系统上,下模拟键事件-8) simulate_key(fd_kbd,KEY_RIGHT);否则-simk_key(fd_kbd,KEY_LEFT);否则-8) simulate_key(fd_kbd,KEY_UP);否则Simulation_key(fd_kbd,KEY_DOWN); tbox pbox; x_pixel_move 三、存在的问题和解决方案:1、获取鼠标的绝对坐标:据我所知,Linux或c似乎没有提供直接获取鼠标绝对坐标的API,但需要另控件则没有。妥善处理:可以通过卡尔曼滤波和速度映射加以改进,然后再进行处理; 3、代码结构凌乱:一旦添加了很多模块,代码就会变得凌乱,因此以后需要组织每个模块的代码,这已经达到了强大的内聚点,并且代码易于实现管理。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/bofangqi/article-366819-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值