我司呢,有深信服網關。
我們做項目,日常是比較“清閑”的,所以呢,深信服讓你沒有辦法愉快的使用電腦,
但是手機是可以連外網和外面的 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(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 我們可以做出很多很有用的東西,比如肝肝肝的游戲做腳本,像微信跳一跳的這種輔助也可以實現。
只不過工作量也少不了(手動狗頭