我司呢,有深信服网关。shell
咱们作项目,平常是比较“悠闲”的,因此呢,深信服让你没有办法愉快的使用电脑,微信
可是手机是能够连外网和外面的 wifi 的,因此咱们就玩手机,可是玩手机这么明显会被 Leader 打死的。优化
因此,硬核一点,用电脑玩本身的手机。动画
adb.exe 就不介绍了,自行百度。一言以蔽之就是 PC 用来调试安卓手机的。spa
http://adbshell.com/downloads 下载地址。线程
adb 的命令你们也自行百度,或者看文档,有不少博文资料。调试
咱们的目的简单来讲就两点,一是能够看到手机屏幕,二是能够操做。code
下面给出关键的代码。orm
首先加载时blog
用 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(1000); } } }
第一句 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 = 3 * e.X; var tapy = 3 * e.Y; StatusInfo(string.Format("点击屏幕 {0} {1}", tapx.ToString("0"), tapy.ToString("0"))); var result = CMDHelper.Execute(string.Format("adb shell input tap {0} {1}", tapx.ToString("0"), tapy.ToString("0")));//点击坐标 StatusInfo(result); }
点击的处理写在 PictureBox 的点击事件里,
这里主要讲一下坐标,好比个人小米5s 像素是1920*1080。
截取得到的图片也是这个像素,那么在pc显示器上按照这个像素显示是不ok的,
这里按一个倍数缩小就好了,我是省事写死了。个人 PictureBox 高宽是 640*360 sizeModel 调整成 StretchImage 便可,这样图片按比例缩放不会变形。
而后计算实际的坐标时也只须要乘回缩小的倍数就能够了。
这些就是最基本的代码了。
基于 adb 咱们能够作出不少颇有用的东西,好比肝肝肝的游戏作脚本,像微信跳一跳的这种辅助也能够实现。
只不过工做量也少不了(手动狗头