关于学习和教育

注:以下观点仅代表个人的看法和想法,不代表任何其他的东西。

我个人理解的学习不是考试什么的,而是真正可以用到的东西,有的人可能觉得学习什么高等数学什么的基本上用不到,但是我个人觉得,我们学习的不仅仅只是这里面的东西,为了考试。我觉得我们学习的更多的是里面的思维方式和逻辑,去当我们学习其他的东西,所以为什么有的人说小学看不出成绩,我觉得小学学的数学更应该叫算数,我们可以通过大量的练习提升成绩,但是,人的思维方式却很难通过这种方式提升,我觉得提升的方式更多是要提高人的思维方式,关于怎么提升,我也不知道,这个是教育家的事,我在这里只提供自己的想法,但是,我们在提升思维方式时,还是应该要大量的练习,因为一般来说只有你对一个东西很熟悉了,才能发现其他的东西。还有就是我现在还记得我爹说的就是,无论你在什么地方,学到东西才是实的,其他的任何东西都是虚的。

还有我觉得教育人的话,第一件事情是教会人有一个正确的三观,这是一切的前提,要让其对这个世界有了一个初步的认识,然后教会人有一个良好的品德,这是做人最基本的两个东西,还有就是自己都做不到的东西就不要要求人家去做,我们每个人都有不好或做不到的地方,在我眼里没有完美的人,只有不断追求完美的人,还有任何娱乐设备,不应该做过多的限制,可以有一定的限制,但是一定要让他有一定的娱乐,毕竟人的精力是有限的,没有人可以一直工作和学习,当人过度沉迷于一个东西时刻,我觉得他只是其他的方面不太舒服,想要靠沉迷于一个东西来短暂躲避这些不快的事情,这就是我对于教育的观点。

无论在任何地方,我们不应该忘记学习或者叫提升自己更贴切,这才是我们学习和成功的关键。

这些都是我突发奇想想写的东西,用于记录自己的一些想法。

[内网穿透]普通Windows用户使用ME Frp启动隧道教程

1.下载客户端

打开 文件下载 页面,下载源选择蓝奏云(看个人),系统选择Windows,64 位系统用户请下载 amd64 架构,32 位系统请下载 386 架构。

注意!兼容性要求

若您是 Windows 10 以下、Windows Server 2016 以下、macOS 10.15 以下的用户,请使用 上游开源的 frpc v0.51.3,我们会尽量保持上游 frpc 的兼容性,不过部分功能将失效。
此外,使用旧版本只能收到有限技术支持。

2.获取启动配置

前往 隧道管理 页面,找到您需要启动的节点。

点击展开下方的“更多”选项,选择“生成启动配置”。

点击复制

3.启动隧道

将下载好的客户端放入一个文件夹里,并创建一个.txt文本文档

打开.txt文本文档,将复制好的启动配置粘贴进去

Windows用户如果使用命令提示符,请自行把./mefrpc换成mefrpc

保存,然后修改.txt文本文档后缀改成.bat

修改好后缀之后,直接双击打开.bat文件即可

这样就成功启动隧道了,快去试试吧!

关于学习和教育

注:以下观点仅代表个人的看法和想法,不代表任何其他的东西。

我个人理解的学习不是考试什么的,而是真正可以用到的东西,有的人可能觉得学习什么高等数学什么的基本上用不到,但是我个人觉得,我们学习的不仅仅只是这里面的东西,为了考试。我觉得我们学习的更多的是里面的思维方式和逻辑,去当我们学习其他的东西,所以为什么有的人说小学看不出成绩,我觉得小学学的数学更应该叫算数,我们可以通过大量的练习提升成绩,但是,人的思维方式却很难通过这种方式提升,我觉得提升的方式更多是要提高人的思维方式,关于怎么提升,我也不知道,这个是教育家的事,我在这里只提供自己的想法,但是,我们在提升思维方式时,还是应该要大量的练习,因为一般来说只有你对一个东西很熟悉了,才能发现其他的东西。还有就是我现在还记得我爹说的就是,无论你在什么地方,学到东西才是实的,其他的任何东西都是虚的。

还有我觉得教育人的话,第一件事情是教会人有一个正确的三观,这是一切的前提,要让其对这个世界有了一个初步的认识,然后教会人有一个良好的品德,这是做人最基本的两个东西,还有就是自己都做不到的东西就不要要求人家去做,我们每个人都有不好或做不到的地方,在我眼里没有完美的人,只有不断追求完美的人,还有任何娱乐设备,不应该做过多的限制,可以有一定的限制,但是一定要让他有一定的娱乐,毕竟人的精力是有限的,没有人可以一直工作和学习,当人过度沉迷于一个东西时刻,我觉得他只是其他的方面不太舒服,想要靠沉迷于一个东西来短暂躲避这些不快的事情,这就是我对于教育的观点。

无论在任何地方,我们不应该忘记学习或者叫提升自己更贴切,这才是我们学习和成功的关键。

这些都是我突发奇想想写的东西,用于记录自己的一些想法。

编程语言介绍

注:按照我个人的理解就是设定好一系列的命令,让人或者物去执行。

那么什么是编程语言,就是给电脑下指令的语言,对就这么简单。

我们知道电脑就只认识0和1

因为电脑内部全是电路,所以只有两种状态:

  • 通电 → 记为 1

  • 断电 → 记为 0

所有计算、图片、视频、软件,本质上都是一长串 0 和 1。
这种直接用 0 和 1 写的程序,叫机器语言。(这玩意应该算最老的语言了吧,有大佬可以试试看用这个写有多费事),而且如果要用这个写,人根本记不住、看不懂、写不动一长串 0和1
写一个简单加法都要几十位二进制,很容易写错,还没法改。

所以有人发明了“更像人话”的语言

为了不直接写 0 和 1,人们一步步创造了编程语言:

1. 汇编语言
用简单英文单词代替 0 和 1,比如  ADD  代表加法。
还是很难用,只能写很简单的程序。(但是这比用0和1好用多了,却也还不够简洁)
于是便有了更高级的语言。

2. 高级编程语言
比如 C、Python、Java、JavaScrip
语法更接近英文和数学,人能看懂、好写、好改。
写完后,再由软件自动翻译成 0 和 1 给电脑执行。

所以本质他还是要转换成0和1,但是这就好用多了。

  1. 那么为什么要有这么多种语言?

就像现实中有中文、英文、法语、日语一样,不同语言适合不同事:

  • 做系统、硬件 → 用 C、C++(快、接近底层)

  • 做网站、小程序 → 用 JavaScript(网页专用)

  • 做 AI、数据分析 → 用 Python(简单、库多)

  • 做手机 APP → 用 Java/Kotlin、Swift

  • 做游戏 → 用 C#、C++、Lua

用不同的语言做不同的事情可以事半功倍,就和造房子一样不可能只用一种材料。

4、总结

就我个人来说我是比较喜欢python的因为这是我最开始学的,我也觉得很最适合新手上手的语言,反正编程语言的目的其实就是为了方便你操作的工具,只要可以达到目的哪怕是写出屎山都行。

编程语言介绍

注:按照我个人的理解就是设定好一系列的命令,让人或者物去执行。

那么什么是编程语言,就是给电脑下指令的语言,对就这么简单。

我们知道电脑就只认识0和1

因为电脑内部全是电路,所以只有两种状态:

  • 通电 → 记为 1

  • 断电 → 记为 0

所有计算、图片、视频、软件,本质上都是一长串 0 和 1。
这种直接用 0 和 1 写的程序,叫机器语言。(这玩意应该算最老的语言了吧,有大佬可以试试看用这个写有多费事),而且如果要用这个写,人根本记不住、看不懂、写不动一长串 0和1
写一个简单加法都要几十位二进制,很容易写错,还没法改。

所以有人发明了“更像人话”的语言

为了不直接写 0 和 1,人们一步步创造了编程语言:

1. 汇编语言
用简单英文单词代替 0 和 1,比如  ADD  代表加法。
还是很难用,只能写很简单的程序。(但是这比用0和1好用多了,却也还不够简洁)
于是便有了更高级的语言。

2. 高级编程语言
比如 C、Python、Java、JavaScrip
语法更接近英文和数学,人能看懂、好写、好改。
写完后,再由软件自动翻译成 0 和 1 给电脑执行。

所以本质他还是要转换成0和1,但是这就好用多了。

  1. 那么为什么要有这么多种语言?

就像现实中有中文、英文、法语、日语一样,不同语言适合不同事:

  • 做系统、硬件 → 用 C、C++(快、接近底层)

  • 做网站、小程序 → 用 JavaScript(网页专用)

  • 做 AI、数据分析 → 用 Python(简单、库多)

  • 做手机 APP → 用 Java/Kotlin、Swift

  • 做游戏 → 用 C#、C++、Lua

用不同的语言做不同的事情可以事半功倍,就和造房子一样不可能只用一种材料。

4、总结

就我个人来说我是比较喜欢python的因为这是我最开始学的,我也觉得很最适合新手上手的语言,反正编程语言的目的其实就是为了方便你操作的工具,只要可以达到目的哪怕是写出屎山都行。

一套完整的产品的组成

注:这是本人理解的一套完整产品的大致组成

  1. 前端(商场的前台)

就是你打开软件第一眼看到的所有东西:页面长啥样、按钮在哪、点了会跳去哪。
它只负责好看、好点、好操作,做前端的通常叫切片仔,当然只是调侃。

基本上前端用这些写

网页结构用 HTML

样式美化用 CSS

点击交互用 JavaScript。

  1. API 接口(商场里的通道)

你在柜台前想买东西,不能直接冲进仓库,得有人帮你传话、拿货。
API 就是干这个的:前端和后端之间的传话员。
你点一下“登录”“提交”,前端就通过 API 去找后端办事。

理解为接口就行,大火的ai基本上经常用到这些接口,用于方便使用,不用单独自己去写,会调用别人的接口就可以做很多事情

接口不是单独写的,直接写在后端代码里。

  1. 后端(统一商场的管理

用户看不见,但所有真正的事情都在这处理:
判断账号对不对、算钱、存订单、查记录、发验证码……
相当于整个软件的大脑。

Java、Python、Go、Node.js 这些都行,选一种就可以,我个人觉得python挺好的用于写接口这些,而且上手也还好。

  1. 数据库(商场的仓库)

专门存所有信息:用户账号、内容、记录、设置。
软件关掉再打开,数据还在,就是靠它。

个人比较喜欢的是my SQL,毕竟我的个人博客就是用的my SQL

  1. 缓存(商场门口的临时货架)

有些东西大家天天拿,总去仓库翻太慢。
缓存就把常用的放近点,打开更快、不卡顿。

  1. 文件存储(商场的图片广告)

专门放图片、头像、视频、文件这些,不和数据混在一起,我个人是无所谓了,反正数据也不多,一般随便乱存,但是一般建议归档好,不然越到后面越难受。

  1. 服务器 & 运维(商场的物业和管理)

软件得有地方跑,服务器就是它的“房子”。
运维负责把代码放上去、连上网、保证 24 小时不关门、坏了能修。

  1. 安全(商场的保安)

防别人乱搞、偷数据、恶意攻击,保护用户信息和系统稳定,一般就是防火墙啊这些

  1. 设计(商场的布局规划)

决定软件有哪些功能、页面怎么排、怎么用更顺手。
没有设计,就是一堆代码,不是好用的产品。

  1. 测试(商场开业前的试运营)

找人从头到尾用一遍,差不多就是测试bug

一个完整的流程就是:
用户看到的前端 + 传话的API + 处理事情的后端 + 存数据的数据库 + 提速的缓存 + 放图片的存储 + 提供场地的服务器 + 保安一样的安全 + 做布局的设计 + 找问题的测试。

但是这些一般来说就是对与大公司,我们个人开发是怎么舒服怎么来。

我个人就准备前后端,一个数据库和一个服务器,还有写后端好接口,其他的就不管了。

搞懂这几个基本上就等于知道了一个完整的开发流程。

对于大公司来说当然可能更复杂,我这里简化了很多东西,但是我个人觉得大致的流程就是这样,如果有大佬是专门做这方面的,欢迎补充

一套完整的产品的组成

注:这是本人理解的一套完整产品的大致组成

  1. 前端(商场的前台)

就是你打开软件第一眼看到的所有东西:页面长啥样、按钮在哪、点了会跳去哪。
它只负责好看、好点、好操作,做前端的通常叫切片仔,当然只是调侃。

基本上前端用这些写

网页结构用 HTML

样式美化用 CSS

点击交互用 JavaScript。

  1. API 接口(商场里的通道)

你在柜台前想买东西,不能直接冲进仓库,得有人帮你传话、拿货。
API 就是干这个的:前端和后端之间的传话员。
你点一下“登录”“提交”,前端就通过 API 去找后端办事。

理解为接口就行,大火的ai基本上经常用到这些接口,用于方便使用,不用单独自己去写,会调用别人的接口就可以做很多事情

接口不是单独写的,直接写在后端代码里。

  1. 后端(统一商场的管理

用户看不见,但所有真正的事情都在这处理:
判断账号对不对、算钱、存订单、查记录、发验证码……
相当于整个软件的大脑。

Java、Python、Go、Node.js 这些都行,选一种就可以,我个人觉得python挺好的用于写接口这些,而且上手也还好。

  1. 数据库(商场的仓库)

专门存所有信息:用户账号、内容、记录、设置。
软件关掉再打开,数据还在,就是靠它。

个人比较喜欢的是my SQL,毕竟我的个人博客就是用的my SQL

  1. 缓存(商场门口的临时货架)

有些东西大家天天拿,总去仓库翻太慢。
缓存就把常用的放近点,打开更快、不卡顿。

  1. 文件存储(商场的图片广告)

专门放图片、头像、视频、文件这些,不和数据混在一起,我个人是无所谓了,反正数据也不多,一般随便乱存,但是一般建议归档好,不然越到后面越难受。

  1. 服务器 & 运维(商场的物业和管理)

软件得有地方跑,服务器就是它的“房子”。
运维负责把代码放上去、连上网、保证 24 小时不关门、坏了能修。

  1. 安全(商场的保安)

防别人乱搞、偷数据、恶意攻击,保护用户信息和系统稳定,一般就是防火墙啊这些

  1. 设计(商场的布局规划)

决定软件有哪些功能、页面怎么排、怎么用更顺手。
没有设计,就是一堆代码,不是好用的产品。

  1. 测试(商场开业前的试运营)

找人从头到尾用一遍,差不多就是测试bug

一个完整的流程就是:
用户看到的前端 + 传话的API + 处理事情的后端 + 存数据的数据库 + 提速的缓存 + 放图片的存储 + 提供场地的服务器 + 保安一样的安全 + 做布局的设计 + 找问题的测试。

但是这些一般来说就是对与大公司,我们个人开发是怎么舒服怎么来。

我个人就准备前后端,一个数据库和一个服务器,还有写后端好接口,其他的就不管了。

搞懂这几个基本上就等于知道了一个完整的开发流程。

对于大公司来说当然可能更复杂,我这里简化了很多东西,但是我个人觉得大致的流程就是这样,如果有大佬是专门做这方面的,欢迎补充

一些感想

这里就当写个日记把,没啥内容好写的,就只是养成个写博客的习惯。想写点自己想说的,这个板块仅代表个人观点。

就发表一下自己的感想吧,感觉就是你做一些自己喜欢的事情就感觉不会累,这是一个很享受的过程,我不知道我对这些爱好会坚持多久,可能后面上班了就不会有这么多时间搞这些乱七八糟的东西了,我个人做这个网站纯粹算圆了自己的一个梦吧,可能有的人不太理解。觉得我算那种游手好闲的,但是我觉得,大学算是我后面可能为数不多不会受其他人影响的想做自己想做的事情的,比较我开始确实没有想好做什么,上大学其实算有点迷茫的吧,看见大一就有不少人卷,而且他们真的很努力,我觉得我做不到,我就觉得普普通通的做点自己喜欢的就行了,不太去想太多东西,算是比较蠢的,这是我自己的看法,人就那么多年,做好自己喜欢的就行。

我个人觉得我算是一个比较幸运的人吧,虽然家庭不算大富大贵,但是起码一生的安安稳稳的,我希望就这样一直下去,上大学这段时间我感受就是大学是一个很开放的地方,就是你在学完基本课程以后,想干什么都行,不会有人要求你做什么,开始很爽,基本就是打游戏,但是多了也无聊,就会想一些乱七八糟的东西,我个人就是闲的蛋疼学了一堆乱七八糟的,也不知道后面用不用的上,又不想这些东西荒废,就搞成了博客,我相信后面的自己看到了也觉得挺好的吧,起码可以吹牛,大学是真的搞了写东西的,虽然就最多是吹个牛。

还有就是我不知道我的父母和我兄弟是怎么看待这些东西的,但我觉得我父母应该也是算比较开明的吧,我兄弟的想法我不知道,但感觉应该也还好,在父母眼中可能有点算不务正业吧,就天天抱着个电脑看,但是只要不影响正常的学习什么的不会特别反对就是了。

说了这么多,我个人的想法就是有什么想做的,什么想法就去做,我开始写代码的时候全是ai的,现在慢慢的好起来了,什么事情都怕第一步,现在不去做,后面想做就太难了。做一件事最好的时间就是你想到去做的时候,不要怕做了,就起码不后悔。

也不知道怎么写结尾,就用语文我读书是经常做结尾的来说吧,希望你能活出一个你想活出的人生吧,不要太在乎别人的看法了。

一些感想

这里就当写个日记把,没啥内容好写的,就只是养成个写博客的习惯。想写点自己想说的,这个板块仅代表个人观点。

就发表一下自己的感想吧,感觉就是你做一些自己喜欢的事情就感觉不会累,这是一个很享受的过程,我不知道我对这些爱好会坚持多久,可能后面上班了就不会有这么多时间搞这些乱七八糟的东西了,我个人做这个网站纯粹算圆了自己的一个梦吧,可能有的人不太理解。觉得我算那种游手好闲的,但是我觉得,大学算是我后面可能为数不多不会受其他人影响的想做自己想做的事情的,比较我开始确实没有想好做什么,上大学其实算有点迷茫的吧,看见大一就有不少人卷,而且他们真的很努力,我觉得我做不到,我就觉得普普通通的做点自己喜欢的就行了,不太去想太多东西,算是比较蠢的,这是我自己的看法,人就那么多年,做好自己喜欢的就行。

我个人觉得我算是一个比较幸运的人吧,虽然家庭不算大富大贵,但是起码一生的安安稳稳的,我希望就这样一直下去,上大学这段时间我感受就是大学是一个很开放的地方,就是你在学完基本课程以后,想干什么都行,不会有人要求你做什么,开始很爽,基本就是打游戏,但是多了也无聊,就会想一些乱七八糟的东西,我个人就是闲的蛋疼学了一堆乱七八糟的,也不知道后面用不用的上,又不想这些东西荒废,就搞成了博客,我相信后面的自己看到了也觉得挺好的吧,起码可以吹牛,大学是真的搞了写东西的,虽然就最多是吹个牛。

还有就是我不知道我的父母和我兄弟是怎么看待这些东西的,但我觉得我父母应该也是算比较开明的吧,我兄弟的想法我不知道,但感觉应该也还好,在父母眼中可能有点算不务正业吧,就天天抱着个电脑看,但是只要不影响正常的学习什么的不会特别反对就是了。

说了这么多,我个人的想法就是有什么想做的,什么想法就去做,我开始写代码的时候全是ai的,现在慢慢的好起来了,什么事情都怕第一步,现在不去做,后面想做就太难了。做一件事最好的时间就是你想到去做的时候,不要怕做了,就起码不后悔。

也不知道怎么写结尾,就用语文我读书是经常做结尾的来说吧,希望你能活出一个你想活出的人生吧,不要太在乎别人的看法了。

手机投屏到电脑(adb加python)

注:这是本人用adb连接手机用python写的图像界面,使用前请先用adb连接好要控制的手机如果不知道怎么连接的可以看我这篇文章电脑adb连接模拟器,本项目以上传到本人Github仓库,但因为是python的原因可能会有一点延迟。

Github仓库地址:suyihang15/ADB-link-tool: 用于有电脑上用ADB连接手机的需求的人,做了简单的图形化界面

1、环境准备

python

2、源码介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import subprocess
import cv2
import numpy as np
import tkinter as tk
from PIL import Image, ImageTk
import threading
import time

# 改成你自己的 adb 路径
ADB_PATH = r"\adb.exe" #填你下载的adb.exe文件的地址,不然后面的都不行的,记住
WIN_W = 480
WIN_H = 950

class PhoneControl:
def __init__(self, root):
self.root = root
self.root.title("手机联机软件(作者Mr.苏)")
self.root.geometry(f"{WIN_W}x{WIN_H}")

# 1. 投屏显示区域:用于显示手机画面
self.screen = tk.Label(root)
self.screen.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
self.screen.bind("<Button-1>", self.click) # 绑定鼠标点击事件

# 2. 功能按键区:返回、主页、唤醒等
btn_frame = tk.Frame(root)
btn_frame.pack(pady=5)
tk.Button(btn_frame, text="返回", command=self.back).grid(row=0, column=0, padx=3)
tk.Button(btn_frame, text="主页", command=self.home).grid(row=0, column=1, padx=3)
tk.Button(btn_frame, text="唤醒", command=self.wake).grid(row=0, column=2, padx=3)
tk.Button(btn_frame, text="电源", command=self.power).grid(row=0, column=3, padx=3)
tk.Button(btn_frame, text="截图", command=self.screenshot).grid(row=0, column=4, padx=3)

# 3. ADB 命令终端区:输入自定义命令
term_frame = tk.Frame(root)
term_frame.pack(fill=tk.X, padx=10, pady=5)
tk.Label(term_frame, text="ADB命令:").pack(side=tk.LEFT)
self.cmd_input = tk.Entry(term_frame)
self.cmd_input.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)
tk.Button(term_frame, text="执行", command=self.run_cmd).pack(side=tk.LEFT)

# 命令输出框:显示命令执行结果
self.output_box = tk.Text(root, height=6)
self.output_box.pack(fill=tk.BOTH, padx=10, pady=5)

self.running = True
self.current_frame = None

# 启动投屏线程
threading.Thread(target=self.stream, daemon=True).start()
# 启动声音转发线程
threading.Thread(target=self.audio, daemon=True).start()
# 启动界面刷新循环
self.update_ui()

# ---------------------- 核心功能模块 ----------------------
# 投屏流获取:不断从手机抓取屏幕数据(核心循环)
def stream(self):
while self.running:
try:
# 使用 ADB exec-out 命令抓取手机屏幕二进制流
data = subprocess.run([ADB_PATH, "exec-out", "screencap", "-p"], stdout=subprocess.PIPE).stdout
# 数据过短表示抓取失败,跳过
if len(data) < 1000:
continue
# 将二进制流转为 numpy 数组
nparr = np.frombuffer(data, np.uint8)
# 解码为图片
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# 转换颜色格式 (BGR -> RGB) 并赋值给当前帧变量
if img is not None:
self.current_frame = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
except:
pass
# 控制抓取频率,0.008秒 = 125帧左右
time.sleep(0.008)

# UI 画面刷新:将 current_frame 显示在 Label 上
def update_ui(self):
if self.current_frame is not None:
try:
h, w = self.current_frame.shape[:2]
# 计算缩放比例,保证画面适应窗口且不变形
scale = min(WIN_W/w, 850/h)
img = cv2.resize(self.current_frame, (int(w*scale), int(h*scale)))
# 转为 Tkinter 可用的图片格式
imgtk = ImageTk.PhotoImage(Image.fromarray(img))
# 更新界面显示
self.screen.config(image=imgtk)
self.screen.imgtk = imgtk # 强制保存引用,防止被垃圾回收
except:
pass
# 递归调用,实现每 8 毫秒刷新一次界面
if self.running:
self.root.after(8, self.update_ui)

# 鼠标点击控制:将电脑鼠标坐标映射为手机坐标并发送点击指令
def click(self, e):
if self.current_frame is None:
return
h, w = self.current_frame.shape[:2]
# 计算真实的手机点击位置
x = int(e.x * w / WIN_W)
y = int(e.y * h / 850)
# 执行 ADB 点击命令
subprocess.Popen([ADB_PATH, "shell", "input", "tap", str(x), str(y)])

# 音频转发:通过 screenrecord 转发手机声音流
def audio(self):
while self.running:
try:
# 启动手机录屏并输出到标准输出(用于转发声音)
subprocess.Popen([ADB_PATH, "shell", "screenrecord", "--output-format", "h264", "-"],
stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
except:
pass
time.sleep(1)

# ---------------------- 基础按键功能模块 ----------------------
# 模拟手机返回键
def back(self):
subprocess.Popen([ADB_PATH, "shell", "input", "keyevent", "4"])
# 模拟手机主页键
def home(self):
subprocess.Popen([ADB_PATH, "shell", "input", "keyevent", "3"])
# 模拟多任务键
def recent(self):
subprocess.Popen([ADB_PATH, "shell", "input", "keyevent", "187"])
# 模拟唤醒屏幕/点亮屏幕
def wake(self):
subprocess.Popen([ADB_PATH, "shell", "input", "keyevent", "224"])
# 模拟电源键(锁屏/点亮)
def power(self):
subprocess.Popen([ADB_PATH, "shell", "input", "keyevent", "26"])

# 截图功能:截取手机屏幕并保存到电脑
def screenshot(self):
try:
# 先在手机内存截图
subprocess.run([ADB_PATH, "shell", "screencap", "/sdcard/screenshot.png"])
# 拉取到电脑当前目录
subprocess.run([ADB_PATH, "pull", "/sdcard/screenshot.png", "screenshot.png"])
self.output_box.insert(tk.END, "\n截图已保存到当前目录:screenshot.png")
except:
self.output_box.insert(tk.END, "\n截图失败")

# ADB 命令执行:读取输入框的命令并执行
def run_cmd(self):
cmd = self.cmd_input.get().strip()
if not cmd:
return
try:
# 拆分命令并执行
res = subprocess.run([ADB_PATH] + cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 输出结果
self.output_box.insert(tk.END, f"\n> {cmd}\n{res.stdout}{res.stderr}")
self.output_box.see(tk.END) # 滚动到最底部
except Exception as e:
self.output_box.insert(tk.END, f"\n错误:{str(e)}")

if __name__ == "__main__":
root = tk.Tk()
app = PhoneControl(root)
root.mainloop()

3、运行

(1)安装所需第三方库 pip install opencv-python numpy pillow

(2)运行python文件

4、效果展示

这些就是全部功能,如果想直接使用就直接用我打包好的exe文件就行。

5、打包

因为本身功能不算多,打包用pyinstaller这个,后面会再优化以下,可以自行打包试试记得要用到adb.exe哦,要把他一起打包才有用哦,因为本身是基于它的。