☰
使用 AutoHotkey 扩展 ElectronBot:八种 SDK 玩法示例与 DllCall 驱动原理详解
2026/9/25 7:10:06 网站建设 项目流程
  • 智能硬件
  • 机器人
  • 嵌入式
  • 硬件开发

【免费下载链接】ElectronBot

项目地址:https://gitcode.com/gh_mirrors/el/ElectronBot
点击查看免费下载

AutoHotkey(AHK)是一种可以用记事本编辑、保存即运行的脚本语言,本仓库的3.Software/_Tools/AHK-ExpansionPack目录提供了一整套基于稚晖君 ElectronBot SDK 的玩法扩展示例,覆盖微信控制、智能家居、人脸/手势同步、网页远程控制、语音交互、热拔插推送表情与热键调试等八大场景。读完本文,你将掌握如何使用 AutoHotkey 直接通过DllCall调用 ElectronBot 的底层 SDK 接口,理解六自由度关节参数的含义与取值范围,并能直接复现、组合这些示例,把 ElectronBot 变成可被脚本任意调度的桌面机器人。

一、为什么用 AutoHotkey 驱动 ElectronBot

ElectronBot 官方上位机(SDK Player)负责姿势调整、表情推送,但每次都要打开上位机、手动拖参数、再同步。而 AutoHotkey 天生就是为"监听系统事件、模拟键盘、按条件触发动作"而生的脚本语言,把它和 ElectronBotSDK 结合,就能实现:

  • 把任何系统事件(时间、进程、热键、微信消息、语音、网络请求)转成机器人的姿势或表情;
  • 免编译、免界面,记事本编辑.ahk文件后直接运行;
  • 复用 AHK 自身对电脑状态的判断与调用能力,例如"判断时间设置电脑音量""ElectronBot 做姿势时同时播报自定义语音""判断进程状态决定开关某程序"等。

所有示例都采用同一套 DllCall 调用模式:脚本通过DllCall加载目录下的ElectronBotSDK-LowLevel.dll/ElectronBotSDK-Player.dll,并调用导出的AHK_*系列 C 接口,将参数同步上传到 ElectronBot,因此无需任何前端界面。

二、环境准备:安装与编辑

  1. 到 AutoHotkey 官网下载安装包(体积约 3MB),建议使用默认选项安装。虽然 AHK 可以将解释器与脚本设为同名实现免安装运行,但安装后更方便用右键菜单Edit Script直接编辑、调试脚本。
  2. 安装完成后,对任意.ahk文件右键选择Edit Script即可用记事本打开编辑,保存后双击即可运行(SetBatchLines -1等脚本头可保证执行效率)。
  3. 每个示例目录内都附带了详细截图与代码注释;示例运行前先退出其它上位机,确保只有当前脚本独占连接 ElectronBot。

三、核心前置:SDK 的 AHK 接口与姿势参数约定

3.1 LowLevel SDK 导出的 C 接口

目录3.Software/_Tools/AHK-ExpansionPack/ElectronBotSDK/ElectronBotSDK源码/ElectronBotSDK-LowLevel/src/electron_low_level.h定义了供 AHK 调用的extern "C"导出函数:

接口作用
AHK_New()创建 SDK 对象并返回指针
AHK_Connect(void*)/AHK_Disconnect(void*)连接 / 断开 USB 设备
AHK_SetJointAngles(void*, j1..j6, enable)设置六自由度关节角度
AHK_SetImageSrc_Path(void*, path)设置屏幕图像(文件路径)
AHK_SetImageSrc_MatData(void*, data)设置屏幕图像(内存像素数据)
AHK_Sync(void*)将以上设置一次性同步上传
AHK_GetJointAngles(void*, float*)回读当前关节角度
AHK_SetExtraData/AHK_GetExtraData读写额外数据通道(示例中未实际测试)

Player SDK 额外导出AHK_Play(播放表情/视频)、AHK_Stop、AHK_SetPlaySpeed、AHK_GetPose,见 electron_player.h。

3.2 六自由度姿势参数表

示例脚本统一封装了LowLevelSDK类,其同步姿势()方法的参数顺序与含义(与官方上位机一致)如下:

参数含义合法范围
参1(j1)头部-15 ~ 15
参2(j6)身体转向-90 ~ 90
参3(j2)左臂展开-30 ~ 30
参4(j3)左臂抬起-180 ~ 180
参5(j4)右臂展开-30 ~ 30
参6(j5)右臂抬起-180 ~ 180
参7(可选)表情/图片文件路径本地文件路径

调用时先DllCall("...\AHK_SetJointAngles", ...)设置角度,若指定了图片路径则再AHK_SetImageSrc_Path设置图像,最后AHK_Sync一次上传。注意封装层的参数顺序(头部、身体转向、左臂展开、左臂抬起、右臂展开、右臂抬起)与原 C++ SDK 的SetJointAngles顺序并不一一对应,脚本注释中已标明"原SDK对应:j1=头部、j2=左臂展开、j3=右臂抬起、j4=右臂展开、j5=左臂抬起、j6=身体转向"。

3.3 底层图像帧规格

官方底层 SDK 中frameBufferTx[2][240*240*3]定义了 240×240 的 RGB 屏幕帧缓冲(见 electron_low_level.h),这解释了为何后续人脸、视频抽帧示例都要把图像resize到 240×240;SDK 默认的 USB VID 为0x1001、PID 为0x8023。

四、示例 1:通过微信控制 ElectronBot

脚本 Acc取微信消息来控制ElectronBot.ahk 演示了如何用 Windows 无障碍(Accessible,Acc)接口读取微信 PC 版的消息内容,把"收到的指定格式消息"当作控制信号。

  • 使用方法:退出其它上位机 → 打开微信 PC 版与脚本 → 向自己(建议置顶方便收发)发送形如姿势∶15,0,0,0,30,150的命令 → 脚本每隔 1 秒读取一次最新消息并同步到 ElectronBot。
  • 兼容性:适配 2022.8.3 当天微信 PC 版最新版本 3.7.5.23,作者自测 3.4.5.27 ~ 3.7.5.23 可用,且将微信窗口最小化可后台接收。
  • 调试:按F3模拟读取微信消息并同步,按F4直接同步一组固定姿势,用于验证 SDK 链路是否正常。

核心逻辑:

F1循环: WinGet, IDHwnd, ID , 微信 ahk_class WeChatMainWndForPC if WinExist("ahk_id " IDHwnd) { oAcc := AccGet(IDHwnd, "4.1.2.2.2.1.1.1.1.1.1.2.1.1.1") ; 微信用户名 oAcc2 := AccGet(IDHwnd, "4.1.2.2.2.1.1.1.1.1.1.2.2.1") ; 第一个用户的最后一条信息 微信用户名 := oAcc.accName(oAcc.accChildCount) 最后一条信息 := oAcc2.accName(oAcc2.accChildCount) if (InStr(最后一条信息, "姿势")!=0) { ; 用"姿势"二字作为自定义命令识别 分割成数组 := StrSplit(最后一条信息, ",") 姿势.同步姿势(RegExReplace(分割成数组[1], "\D"), 分割成数组[2], 分割成数组[3], 分割成数组[4], 分割成数组[5], 分割成数组[6]) } } Return

要点:AccGet通过DllCall加载oleacc.dll并调用AccessibleObjectFromWindow,再按"4.1.2.2..."这种路径逐级索引子树节点;RegExReplace(分割成数组[1], "\D")会把"姿势∶15"中的非数字字符剥离,从而得到第 1 个关节角度。若右下角没有收到微信信息,说明 Acc 无法获取微信内容(微信版本升级可能导致树路径失效);若收到了信息但机器人无反应,请退出其它上位机并重新插拔 ElectronBot。

五、示例 2:用继电器硬改实现对智能家居的控制

串口通信_长按示例.ahk 采用"硬改"思路:以小米无线开关为例,用 CH340 驱动的继电器模拟按键的单击、双击、长按,从而让电脑(经由 AHK 的 RS232 串口通信)直接控制智能家居。其串口参数如下:

RS232_Port := "COM1" ; 改成继电器对应的COM号 RS232_Baud := 9600 RS232_Parity := "N" RS232_Data := 8 RS232_Stop := 1 RS232_Settings := RS232_Port ":baud=" RS232_Baud " parity=" RS232_Parity " data=" RS232_Data " stop=" RS232_Stop " dtr=Off"

长按 1.3 秒的实现(按下 → 延时 → 抬起):

RS232_Write(RS232_FileHandle, "0xA0,0x01,0x03,0xA4") ; 按下 Sleep 1300 ; 延时1.3秒=长按效果 RS232_Write(RS232_FileHandle, "0xA0,0x01,0x02,0xA3") ; 抬起

双击则是在两次"按下/抬起"之间插入约 100ms 间隔。底层RS232_Initialize用BuildCommDCB构造 DCB、CreateFile打开串口、SetCommState/SetCommTimeouts完成配置;RS232_Write把逗号分隔的十六进制字节解析写入缓冲区后调用WriteFile发送。脚本还处理了COM 口大于 9 时必须加\\.\前缀的经典坑位,并用\\.\方式支持 USB-Serial 转接设备。作者也提示,除继电器外完全可以用 Arduino + MOS 管实现同样的单击/双击/长按逻辑。

六、示例 3:"量子纠缠"Demo:摄像头人脸同步

量子纠缠Demo.ahk 模仿稚晖君视频中的"量子纠缠"效果:从摄像头截取人脸,实时同步到 ElectronBot 的脸部屏幕,同时做出右手挥手动作。运行前需把脚本与 haarcascade_frontalface_default.xml 放到ElectronBotSDK目录,并确保摄像头画面中有可识别面部。

核心流程:

; 加载OpenCV COM组件 hOpenCV := DllCall("LoadLibrary", "Str", "opencv_world455.dll", "Ptr") hOpenCVCom := DllCall("LoadLibrary", "Str", "autoit_opencv_com455.dll", "Ptr") cv := ComObjCreate("OpenCV.cv") Cap := ComObjCreate("OpenCV.CV.VideoCapture") Cap.open(0) ; 摄像头编号从0开始 faceCascade := ComObjCreate("Opencv.cv.CascadeClassifier") faceCascade.load("haarcascade_frontalface_default.xml") Loop { Ret := Cap.read(Frame) frame := cv.rotate(frame, 2) ; 适配ElectronBot的屏幕方向 faces := faceCascade.detectMultiScale(Frame, 1.1+0, 10+0) if (faces.MaxIndex()>-1) { frame := Crop(frame, faces[0]) ; 裁剪人像 frame := cv.resize(frame, ComArrayMake([240, 240])) ; 缩放到240x240 frame := cv.cvtColor(frame, 3) ; CV_BGRA2RGB := 3 姿势.设置姿势(15, 0, ( (_Waving:=!_Waving) ? 0 : 30), 130, 0, 0) ; 挥动左手 姿势.设置图像Data(frame.data()) 姿势.同步() } else { 姿势.同步姿势(0, 0, 0, 0, 0, 0) ; 检测不到面部就回正 } }

实现细节:Crop函数通过对Img.Row/Img.Col的vconcat/hconcat实现矩形裁剪;像素数据经AHK_SetImageSrc_MatData直接以内存指针上传,与 3.3 节的 240×240 帧缓冲规格对应。若画面无图像,先尝试删除cv.rotate或改用注释中的"纯人脸识别完整显示"(CV.imshow)排查摄像头取流。

七、示例 4:网页控制与网络互动

目录 4.ElectronBot网页控制与网络互动 演示了两件事:

  1. 网页控制:网页控制ElectronBot.ahk 用 AHK 内置的HttpServer类在本地起一个 HTTP 服务(默认端口 8866),把网页路径映射到控制函数:
paths := {"/" : Func("主界面") , "/DianTou" : Func("点头") , "/ZuoShou" : Func("左手驱动") , "/YouShou" : Func("右手驱动") , "/BiaoQing" : Func("表情测试")} Server := New HttpServer() Server.LoadMimes("mime.types") Server.SetPaths(paths) HTTP服务端口 := 8866 Server.Serve(HTTP服务端口) Run "http://127.0.0.1:%HTTP服务端口%/" ; 启动后自动打开控制台网页

页面上的"点头""左手驱动""右手驱动""表情测试"按钮通过window.location.href跳转到对应路由,服务端 handler 再调用姿势.同步姿势(...)或表情.播放表情("video.mp4"),并返回一段history.go(-1)的脚本让浏览器退回主界面。mime.types为静态文件提供 Content-Type 映射。因为监听的是本机端口,手机或电脑只要访问同一网络内的该地址即可远程操控 ElectronBot。

  1. TCP 互动:Tcp通信测试【主机端】.ahk 与Tcp通信测试【接收端】.ahk用SocketTCP类(基于 Winsock 的socket/bind/listen/accept/send/recv+WSAAsyncSelect事件模型)验证两台电脑之间的通信:主机端监听0.0.0.0:33345,按F1发送姿势∶15,0,0,0,30,150、按F2发送回正指令,接收端解析后驱动各自的 ElectronBot——由此可在局域网甚至公网 IP 下远程同步两台机器人的互动反应。

八、示例 5:摄像头手势识别与动作同步

此示例需要配合另一个 AHK 手势识别项目VisualGestureRecognition使用:将本目录的MyAHKScript、Lib、ElectronBotSDK三个文件夹放到手势识别项目主脚本同目录并覆盖替换后,重新启动并开启手势识别即可。手势参数建议参考 推荐手势设置.jpg 中标注的刷新间隔、画面旋转角度与相同命令识别间隔进行配置。

预设的手势与机器人动作对应关系:

识别到的手势ElectronBot 反应
双手放下回正
单手举起握拳同步举手
单手举起做剪刀手同步剪刀手
双手举起握拳执行一套预设长动作

目录 MyAHKScript 下的1-1-9-9.ahk等文件即"双手举起握拳"的长动作编排:通过大量Sleep与同步姿势序列组合出招手、侧身拍打、高举晃动、拜拜等连贯动作,结束后调用表情.播放表情("video.mp4")收尾。文件中还示范了Global LLSDKFilePath := "test.jpg"这种全局变量指定表情的技巧,让该脚本内所有同步姿势自动附带同一张图片。

注意:使用说明.txt明确指出,此示例是用"不断识别后以新进程方式连接并驱动 ElectronBot"实现的,仅适合演示;若要稳定使用,应把整个流程写进同一个脚本进程内。

九、示例 6:语音控制 ElectronBot

6.语音控制ElectronBot.ahk 调用 Windows 自带 API(SAPI)实现语音识别与播报,让 ElectronBot 变成"语音助手":

  • 唤醒流程:说出唤醒词"电子电子",识别器回调里播放同步语音"在呢"(用ComObjCreate("SAPI.SpVoice").Speak(...)的同步播报顺带充当延时),并打开命令执行开关(SetTimer 无应答重置, -5000实现唤醒后 5 秒无命令自动失效)。
  • 命令表:"你好"(招手 2 次)、"左手"(抬左臂)、"右手"(抬右臂)、"点头"(点头 2 下)、"开心"(播放 video.mp4),执行后异步播报"你说了:..."。
Class 唤醒词类 extends SpeechRecognizer { OnRecognize(Text) { if (Text = "电子电子") { ToolTip % "唤醒词:" Text, A_ScreenWidth//1.13, A_ScreenHeight//1.13 ComObjCreate("SAPI.SpVoice").Speak("在呢") 执行命令开关 := 1 SetTimer 无应答重置, -5000 } } }

SpeechRecognizer类(Uberi 封装的 SAPI 封装)通过SAPI.SpInprocRecognizer获取音频输入,CreateGrammar后用AddWordTransition注册短语规则,识别结果经SpeechRecognizer_Recognition回调分发到OnRecognize;TTS类则基于SAPI.SpVoice提供Speak/SpeakWait/SetRate/SetVolume/SetPitch等能力。系统要求:语音识别依赖系统自带的语音 API,精简版系统可能被删减,若脚本运行时报错则说明缺少 TTS 组件;用原版镜像安装的系统基本可用。作者已提供 SDK 调用方法,具体语音方案可自行替换。

十、示例 7:连接 ElectronBot 时自动推送表情

ElectronBot 每次接入 USB 都会先显示默认花屏,7.连接ElectronBot时自动推送表情.ahk 通过注册 USB 设备监控事件,让插入瞬间自动同步指定表情与姿势:

OnMessage(0x219, "WM_DEVICECHANGE") ; 注册USB设备监控事件 拔出时数组 := JEE_DeviceList() ; 记录拔出前的设备列表 WM_DEVICECHANGE(wParam, lParam, msg, hwnd) { Global if (wParam=0x8000) { ; DBT_DEVICEARRIVAL 插入时 插入时数组 := JEE_DeviceList() Loop % 插入时数组.Length() { if (插入时数组[A_Index]!=拔出时数组[A_Index]) { ElectronBot初始化(新进程代码) Break } } } else if (wParam=0x8004) { ; DBT_DEVICEREMOVECOMPLETE 拔出时 拔出时数组 := JEE_DeviceList() } }

JEE_DeviceList通过setupapi.dll枚举 USB 设备并读取DEVPKEY_Device_FriendlyName,筛选含(COM...)的设备名。检测到新设备插入后,脚本把一段"新进程代码"(AHK_New → AHK_Connect → AHK_SetJointAngles → AHK_SetImageSrc_Path → AHK_Sync → AHK_Disconnect的最小化流程)通过WScript.Shell.Exec以临时进程方式执行,从而在不阻塞主脚本的前提下完成表情推送。脚本注释中还提供了按 COM 端口过滤(如InStr(设备名, "(COM8")!=0)的写法,以及播放 Player 表情的模板代码。此脚本可与示例 8 合并,实现"热拔插同步表情 + 热键连接调试"一体化。

十一、示例 8:热键快速调试 ElectronBot

日常调试需要打开上位机调整参数再同步,而 8.热键快速调试ElectronBot.ahk 把常用调试动作绑定到键盘热键,运行即测:

热键动作
F1 / F2头部上 / 头部下
F3弹出文件选择框选择表情文件并播放
Up / Down左手抬起 / 放下
Left / Right右手抬起 / 放下
F1::姿势.同步姿势(15, 0, 0, 0, 0, 0) ; 头部上 F3:: FileSelectFile, 返回路径, , ,选择ElectronBot的表情, 文件(*.jpg; *.png; *.bmp; *.mp4; *.mov) 表情.播放表情(返回路径) Return

脚本启动时会先执行一组"点头"动作(同步姿势(15,...)后Sleep 100再同步姿势(0,...),并附带test.jpg)以确认连接成功。PlayerSDK.播放表情内部会先AHK_Stop再重建对象重新AHK_Connect,因此连续播放两个表情之间必须保证至少 150ms 延时,避免线程抢占卡死。

十二、进阶:组合与扩展思路

除 8 个现成示例外,一套演示动作示例.ahk 提供了更完整的动作编排参考,并给出了两个可直接复用的函数:

  • 异步抽帧上传表情(video):用 OpenCV 的VideoCapture读取视频,按fps/10的间隔抽帧(10 帧/秒),每帧resize到 240×240、cvtColor(..., 3)转 RGB 后通过AHK_SetImageSrc_MatData上传——这是"让表情动起来"的关键;因为 10 帧/秒的单帧间隔为 166ms,故动作间的Sleep建议不小于 180ms。脚本还处理了中文路径(复制到A_AppDataCommon下再打开)的问题。
  • 异步播放音频(file):基于winmm.dll的mciSendString实现异步播放,可让机器人动作配上音效。

在此基础上,可以自然衍生更多玩法:判断时间自动调音量、姿势触发语音播报、监听进程状态开关程序、把示例 7 与示例 8 合并等。几处容易踩坑的约定值得牢记:

  • ElectronBot 需要64 位 AHK 解释器(示例 7 对此有显式检查提示);
  • 运行任何控制脚本前先退出其它上位机,独占 USB 连接;
  • 同步姿势的参数有合法范围(见 3.2 表格),超范围无效;
  • Player 播放表情前后保留至少 150ms 延时。

十三、仓库资源索引

  • 玩法总览与使用说明:3.Software/_Tools/AHK-ExpansionPack/README.md
  • 各示例脚本与截图:3.Software/_Tools/AHK-ExpansionPack/下1.~8.目录及根目录脚本
  • AHK 版 SDK 源码:3.Software/_Tools/AHK-ExpansionPack/ElectronBotSDK/ElectronBotSDK源码/(LowLevel 与 Player 的AHK_*导出实现)
  • 官方 C++ 底层 SDK:electron_low_level.h、electron_low_level.cpp
  • Player 上层封装:electron_player.h、sample.cpp
  • 完整 SDK 依赖(DLL、OpenCV、表情视频):3.Software/_Tools/AHK-ExpansionPack/ElectronBotSDK/

借助这份扩展包,ElectronBot 不再局限于上位机的手动操作,而是可以被微信、语音、网页、手势、热键乃至任何 AHK 可感知的系统事件所驱动——把它当作一个可编程的桌面实体交互终端来使用。

  • 智能硬件
  • 机器人
  • 嵌入式
  • 硬件开发

【免费下载链接】ElectronBot

项目地址:https://gitcode.com/gh_mirrors/el/ElectronBot
点击查看免费下载
上一篇:Qwopus3.5-4B-Coder-MTP-GGUF高级教程:构建自定义工具调用系统的完整流程
下一篇:【亲测免费】 探索 LunarVim:为 Neovim 打造的现代 IDE 层

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询