C# 基于 adb 控制安卓
我司呢,有深信服网关。
我们做项目,日常是比较“清闲”的,所以呢,深信服让你没有办法愉快的使用电脑,
但是手机是可以连外网和外面的 wifi 的,所以我们就玩手机,但是玩手机这么明显会被 Leader 打死的。
所以,硬核一点,用电脑玩自己的手机。
adb.exe 就不介绍了,自行百度。一言以蔽之就是 PC 用来调试安卓手机的。
http://adbshell.com/downloads 下载地址。
adb 的命令大家也自行百度,或者看文档,有很多博文资料。
我们的目的简单来说就两点,一是可以看到手机屏幕,二是可以操作。
下面给出关键的代码。
首先加载时
用 adb 命令连接设备
这里还不知道多个设备会怎么样,因为我只有一个(哭
var result = CMDHelper.Execute("adb shell getprop ro.product.model");
StatusInfo($"检查设备:{result}");
if (result.Contains("no devices") || string.IsNullOrWhiteSpace(result))
{
RadioButtonStop.Enabled = true;
StatusInfo("未检测到设备");
}
else
{
RadioButtonStop.Enabled = false;
BackgroundWorker = new BackgroundWorker();
BackgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
BackgroundWorker.RunWorkerAsync();
}
连接设备成功之后,开后台工作线程,委托方法执行。
BackgroundWorker BackgroundWorker = null;
方法:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//循环截屏获取图片
while (true)
{
if (RadioButtonStop.Enabled)
{ return; } StatusInfo("获取屏幕"); var tempFileName = "001.png";
CMDHelper.Execute("adb shell screencap -p /sdcard/" + tempFileName);
CMDHelper.Execute("adb pull /sdcard/" + tempFileName); if (System.IO.File.Exists(tempFileName))
{
using (var temp = Image.FromFile(tempFileName))
{
PictureBox.Invoke(new Action(() => { PictureBox.Image = new Bitmap(temp); }));
}
GC.Collect();
if (System.IO.File.Exists(tempFileName))
{
try
{
System.IO.File.Delete(tempFileName);
}
catch
{
}
}
Thread.Sleep();
}
}
}
第一句 adb 命令是手机截图存储在自身sdcard目录下。
第二句是将这个文件拉取到 adb 的所在文件夹。
然后GC强制清一下内存,然后线程等待1秒。
避免刷新过于频繁,实际上使用的时候会发现卡顿明显,方法基本上是3s运行一次,这中间跨机器的操作,截图,IO,慢一点也是正常。
假如要玩肝肝肝的游戏,实时的画面就不是那么重要。
优化的思路的话,平常可以是不刷新或者很久才刷新,然后在操作过后等待1-2s的动画再进行刷新,或者把安卓的动画直接关掉,这样就不会感觉到卡顿。
然后是点击的处理:
private void PictureBox_MouseClick(object sender, MouseEventArgs e)
{
if (PictureBox.Image == null)
{ return; } if (e.Button != System.Windows.Forms.MouseButtons.Left)
{ return; } //计算实际坐标
var tapx = * e.X;
var tapy = * e.Y; StatusInfo(string.Format("点击屏幕 {0} {1}", tapx.ToString(""), tapy.ToString(""))); var result = CMDHelper.Execute(string.Format("adb shell input tap {0} {1}", tapx.ToString(""), tapy.ToString("")));//点击坐标
StatusInfo(result);
}
点击的处理写在 PictureBox 的点击事件里,
这里主要讲一下坐标,比如我的小米5s 像素是1920*1080。
截取获得的图片也是这个像素,那么在pc显示器上按照这个像素显示是不ok的,
这里按一个倍数缩小就行了,我是省事写死了。我的 PictureBox 高宽是 640*360 sizeModel 调整成 StretchImage 即可,这样图片按比例缩放不会变形。
然后计算实际的坐标时也只需要乘回缩小的倍数就可以了。
这些就是最基本的代码了。
基于 adb 我们可以做出很多很有用的东西,比如肝肝肝的游戏做脚本,像微信跳一跳的这种辅助也可以实现。
只不过工作量也少不了(手动狗头
C# 基于 adb 控制安卓的更多相关文章
- 使用Scrcpy实现电脑控制安卓手机
很多时候我们想要在电脑上使用一些手机软件,使用模拟器当然是一种选择,但是这些模拟器要不然不免费,要不然广告多不放心.Scrcpy是一个开源免费的软件,通过abd命令实现了安卓手机投屏和控制功能,并且支 ...
- 5.1 万 Star!不用 root 就能连接控制安卓的开源工具
[导语]:一款在 PC 端控制安卓设备的小工具.可在 PC 和安卓设备间互通剪贴板.用电脑键盘打字.传输文件.安装程序.截图.录屏等等功能. 简介 scrcpy 可以显示并控制通过 USB (或 TC ...
- sis9280触摸ic 基于rk3288 的安卓4.4的 多点触摸
前言:sis提供的驱动ic.基于rk3288的安卓系统.亲眼看到人家完成一次移植.很激动的记下一些东西..虽然我看不懂.其实现在的工作也不需要看懂.叫人协助就好,只需要知道有这个东西. 1linux下 ...
- [转]如何用adb控制MTKLogger
[DESCRIPTION] 如何通过adb command去控制MTKLogger 开关,设定log路径等等. [KEYWORD] MTKLogger adb控制 路径 大小 [SOLUTION] 1 ...
- 基于TCP的安卓服务器开发
一.说明 前文介绍了基于安卓客户端的开发,在此基础上,进行少许改动即可开发出一款基于TCP的安卓服务器,理论知识请参见笔者上一篇博文,下面直接实践操作. 二.权限申明 <!--允许应用程序改变网 ...
- 基于ADB框架Robotium跨进程操作
转自:http://blog.csdn.net/qingchunjun/article/details/42580937 2015年2月3日更新: 有些朋友在用真机尝试本方法时,抛出了InputStr ...
- 基于Netbeans的安卓Android开发环境配置 - CSDN博客
原文:基于Netbeans的安卓Android开发环境配置 - CSDN博客 基于Netbeans的安卓Android开发环境配置 一.准备工作 NetBeans 勾选网页中的Accept-选择对应系 ...
- ADB控制手机命令(adb命令)
手机端配置tcp方式连接 su setprop service.adb.tcp.port 5555 stop adbd start adbd 首先使用管理员权限,然后打开监听5555端口 电脑端使用a ...
- Kali之Metasploit生成apk后门控制安卓
扫盲教程,大佬勿喷. 实验中请更改为你环境的IP. 生成apk后门 Kali Linux(Hack):192.168.169.76 Android(靶机):192.168.169.137 启动kali ...
随机推荐
- CEdit使用(Edit Control控件)
CEdit使用(Edit Control控件) 编辑框只读 属性 Read Only等于 True,就有了只读效果 密码框 属性 Password 等于 True,就有了密码效果 获取值/赋予值 Up ...
- Ubuntu Eclipse C++运行问题:launch failed.Binary not found
在Ubuntu下的Eclipse C++环境出现launch failed.Binary not found问题时,可采用如下解决方案: (1)首先检查系统中是否成功安装g++.如果console输出 ...
- 升级tomcat需要更改哪些配置?
1.上传Tomcatapache-tomcat-7.0.84.zip将38服务器上的Tomcat传到107服务器指定目录:scp /data/apache-tomcat-7.0.84.zip jsdx ...
- IDEA测试结果查看
点击漏斗图标切换查看测试日志信息,点击,导出测试报告
- Android开发之多Fragment切换优化
问题分析 一直在简书里看别人的技术贴,今天我也来写点自己的心得!最近在写一个项目用到大量的Fragment后的总结! 我想刚刚接触安卓的同学或许会这么写: FragmentManager fragme ...
- JS排序算法之快速排序
const Arr = [85, 24, 63, 45, 17, 31, 96, 50]; function quickSort(arr) { 80 if (arr.length <= 1) { ...
- OCM_第十天课程:Section5—》数据仓库
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- ambari下的flume和kafka整合
1.配置flume #扫描指定文件配置 agent.sources = s1 agent.channels = c1 agent.sinks = k1 agent.sources.s1.type=ex ...
- python易错题之作用域
name = "lzl" def f1(): print(name) def f2(): name = "eric" f1() f2() //结果为 lzl 记 ...
- 双线程 线性dp 传纸条
/* 两种做法:一是暴力dp[i][j][k][l] 二是以走的步数k作为阶段, dp[k][i][j]表示走到第k步,第一个人横坐标走到i,第二个人横坐标走到j 可以以此推出第第一个人的坐标为[i, ...