我司呢,有深信服網關。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 咱們能夠作出不少頗有用的東西,好比肝肝肝的遊戲作腳本,像微信跳一跳的這種輔助也能夠實現。
只不過工做量也少不了(手動狗頭