安卓实现按键录制回放

news/2024/10/17 14:25:48/

       最近玩pokemongo需要将扔excellent球的操作录下来,这样子下次直接就可以不用自己手扔了。通过adb进入shell后getevent命令可以打印实时触摸的操作信息,sendevent能够写入操作到触摸屏,实现模拟滑动和点击和其他操作,但是将getevent的16进制转为10进制后给sendevent后批量执行操作,会发现回放得很慢,这是因为不到100行的sendevent.c源码,仅仅是打开触摸设备,然后写入操作,然后关闭设备,所以批量执行sendevent肯定慢,因此我们采用安卓NDK重新修改编译getevent和setevent代码。

      getevent代码需要修改是因为getevent /dev/input/event5 > a.txt后没办法停止,我们内部加一个停止功能,用select判断输入缓冲区有没有数据,有的话就退出录制。只需要加一点代码如下:

while(1) {pollres = poll(ufds, nfds, -1);//printf("poll %d, returned %d\n", nfds, pollres);if(ufds[0].revents & POLLIN) {read_notify(device_path, ufds[0].fd, print_flags);}//添加这些代码FD_ZERO(&fSet);FD_SET(0,&fSet);tv.tv_sec = 0; tv.tv_usec=0;{int ret=select(1,&fSet,NULL,NULL,&tv);if(ret>0) return 0;}//添加结束

这样子在不想要录制屏幕操作的时候虽然输入一些东西回车后,在碰下屏幕就停止录制了。其他的添加需要的头文件,以及修改时间打印格式

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/select.h>
#include <sys/time.h>printf("%8ld %06ld ", event.time.tv_sec, event.time.tv_usec);

一共是需要getevent.c和getevent.h两个文件。

sendevent只需要一个sendevent.c文件,修改为如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/select.h>
#include <sys/time.h>fd_set fSet;
struct timeval tv;
void delay(__time_t tv_sec,__suseconds_t tv_usec)
{tv.tv_sec = tv_sec;tv.tv_usec = tv_usec;select(0,NULL,NULL,NULL,&tv);
}
int convert (char * str) {return (int) strtol(str, NULL, 16);
}
int main(int argc, char *argv[])
{int fdout;FILE * fd_in;//打开录制的数据文件fd_in = fopen(argv[1], "r");if (fd_in == NULL) {fprintf(stderr, "Can't open input file: %s\n", argv[1]);return 1;}//打开触摸屏设备fdout = open(argv[2],O_RDWR);if(fdout<0){perror("open device:");return -1;	}struct input_event event;char type[32];char code[32];char value[32];unsigned int tsec,tusec,initsec,initusec,dtsec,dtusec;int ret;int first = 0;//逐行扫描写入while (fscanf(fd_in, "%u %u %s %s %s", &tsec,&tusec,type, code, value) != EOF) {memset(&event, 0, sizeof(event));event.type = convert(type);event.code = convert(code);event.value = convert(value);memset(type, 0, sizeof(type));memset(code, 0, sizeof(code));memset(value, 0, sizeof(value));ret = write(fdout, &event, sizeof(event));if(ret < sizeof(event)) {fprintf(stderr, "write event failed, %s\n", strerror(errno));return -1;}if(first==0){//初值first=1;	initsec = tsec;initusec = tusec;}else{//计算两个操作间的延时dtsec = tsec - initsec;if(dtsec==0){dtusec = tusec - initusec;   }else{if(tusec<initusec){dtusec = 1000000-initusec + tusec;dtsec-=1;}else{dtusec = tusec-initusec;}}//printf("time diff sec=%u,usec=%u\n",dtsec,dtusec);initsec = tsec;initusec = tusec;}delay(dtsec,dtusec);}fclose(fd_in);close(fdout);return 0;
}

通过ndk-build编译后就可以测试了,测试命令如下

cd /data/local/tmp
dir=/storage/emulated/0
cp $dir/mygetevent .
cp $dir/mysendevent .
chmod 755 mygetevent
chmod 755 mysendevent
//查看触摸屏设备事件号码,为event5
cat /proc/bus/input/devices或者getevent
//录制
./mygetevent -t /dev/input/event5 > record.txt
录制完成后随便输入一些东西回车,摸屏幕退出mygetevent程序
//回放操作
./mysendevent record.txt /dev/input/event5​

在HWP10上测试成功,但是不知道怎么在app中调用这些,只能靠adb shell调用,所以还不是很满意,但是我玩pgo是开飞机的,所以够用了。


http://www.ppmy.cn/news/533379.html

相关文章

如何录制/回放使用工具推荐

在测试过程&#xff0c;我们总是出现重复性劳动工作&#xff0c;步骤都一致&#xff0c;我们希望有个机器人帮我们完成&#xff0c;可是代码又不会写咋办&#xff1f; &#xff08;本文只对刚入门或者没有接触测试的同学&#xff09; 在这里就给大家推荐录制回放的工具&#…

前端监控:回放录制库 rrweb

rrweb rrweb 主要由 rrweb 、 rrweb-player 和 rrweb-snapshot 三个库组成&#xff1a; rrweb&#xff1a;提供了 record 和 replay 两个方法&#xff1b;record 方法用来记录页面上 DOM 的变化&#xff0c;replay 方法支持根据时间戳去还原 DOM 的变化。rrweb-player&#x…

java写键盘鼠标录制器,易语言仿按键精灵录制键盘鼠标操作的代码

DLL命令表 .版本 2 .DLL命令 取按键状态, 短整数型, "user32.dll", "GetAsyncKeyState" .参数 鼠标键, 整数型 .DLL命令 取鼠标位置, 整数型, "user32.dll", "GetCursorPos" .参数 当前鼠标位置, 鼠标位置, 传址 .DLL命令 模拟鼠标按键…

QT 录制鼠标键盘回放

QT 录制鼠标键盘回放 前段时间因为朋友想要解放双手想要把一些操作录制回放 所以做了这个小项目 因为我目前运用的QT只能在程序中去记录鼠标跟键盘的操作 所以网上找了找方法 有钩子函数使用 所以运用了钩子函数 一、Hook Window的钩子可以捕捉整个窗口的鼠标跟键盘 首先我们…

如何预防CC攻击 180.188.22.2

CC攻击是DDoS(分布式拒绝服务)的一种&#xff0c;相比其它的DDoS攻击CC似乎更有技术含量一些。这种攻击你见不到虚假IP&#xff0c;见不到特别大的异常流量&#xff0c;但造成服务器无法进行正常连接&#xff0c;一条ADSL的普通用户足以挂掉一台高性能的Web服务器 。 如何应对…

【备战秋招】每日一题:2023.3.15-阿里OD机试(第三题)-k次操作最小化极差

在线评测链接:P1084 题目内容 在一个遥远的王国里&#xff0c;有一座高耸入云的宝塔&#xff0c;据说里面藏有神秘的宝藏。但是&#xff0c;进入宝塔的道路异常困难&#xff0c;需要经过各种险阻&#xff0c;其中一个重要的关卡是“平衡之门”。 平衡之门是一条走廊&#xf…

Linux组管理和权限管理

一、Linux组 在linux中每个用户必须属于一个组&#xff0c;不能独立于组外&#xff0c;在linux中 文件所有者 一般为文件创建者&#xff0c;可以通过ls -ahl 查看文件所有者 chown 用户名 文件名 &#xff1a;修改文件所有者 groupadd 组名 创建组 当某个用户创建了一个文件…

【C++学习】C++入门 | 缺省参数 | 函数重载 | 探究C++为什么能够支持函数重载

写在前面&#xff1a; 上一篇文章我介绍了C该怎么学&#xff0c;什么是命名空间&#xff0c;以及C的输入输出&#xff0c; 这里是传送门&#xff1a;http://t.csdn.cn/Oi6V8 这篇文章我们继续来学习C的基础知识。 目录 写在前面&#xff1a; 1. 缺省参数 2. 函数重载 3…