C# 基於 adb 控制安卓

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

只不過工做量也少不了(手動狗頭 

相關文章
相關標籤/搜索