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(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 我们可以做出很多很有用的东西,比如肝肝肝的游戏做脚本,像微信跳一跳的这种辅助也可以实现。

只不过工作量也少不了(手动狗头 

 

posted @   Aaxuan  阅读(6593)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示