1. 项目概述:当AI真正学会"动手"操作你的电脑
作为一名长期深耕Windows系统开发的程序员,我一直在思考一个问题:为什么现在的AI助手都停留在"动口不动手"的阶段?它们能回答各种问题,却无法真正帮我们完成那些重复性的电脑操作。直到看到Aries AI在安卓平台上的惊艳表现,我决定用C++为Windows打造一个真正能"动手"的AI助手——这就是Open-Aries-AI诞生的契机。
这个项目的核心突破在于实现了完整的"感知-决策-执行"闭环。不同于传统自动化工具需要预先编写脚本,Open-Aries-AI通过以下方式工作:
- 视觉感知:实时截取屏幕画面
- 认知理解:大模型分析当前界面状态和用户指令
- 动作规划:生成具体的鼠标键盘操作序列
- 执行反馈:完成操作后将结果反馈给AI进行下一轮决策
这种工作模式最吸引我的地方在于它的普适性——不需要为每个应用程序单独开发接口,AI通过"看"屏幕就能理解各种界面,就像真人操作电脑一样自然。
2. 技术架构解析:为什么选择C++和Windows原生API
2.1 语言选型的深层考量
选择C++17作为开发语言主要基于三个关键因素:
性能敏感场景的必然选择
- 屏幕捕获和输入模拟需要毫秒级响应
- 原生API调用几乎没有中间层开销
- 内存管理精准控制(重要考虑:长时间运行无内存泄漏)
Windows平台的最佳搭档
- 直接调用Win32 API和COM接口
- 完美兼容各种系统版本(从Win7到Win11)
- 无需依赖臃肿的运行时环境
长期维护的便利性
- 静态编译生成单个exe文件
- 依赖项极少(仅需VC++运行时)
- 二进制分发简单可靠
提示:虽然现代C++提供了很多高级特性,但项目中仍然保留了部分C风格代码,特别是在GDI+截图和输入模拟部分,这是为了确保与老旧系统的兼容性。
2.2 核心模块设计
项目采用分层架构设计,各模块通过清晰的接口通信:
code复制┌────────────────┐
│ AI Provider │ # 大模型交互层
└───────┬────────┘
│ HTTP/JSON
┌───────▼────────┐
│ Action Parser │ # 动作解析引擎
└───────┬────────┘
│ 结构化指令
┌───────▼────────┐
│ Executor │ # 输入模拟核心
└───────┬────────┘
│ Win32 API
┌───────▼────────┐
│ System Service │ # 系统功能集成
└────────────────┘
关键实现细节:
- 截图模块使用GDI+的
BitBlt直接捕获屏幕DC - 输入模拟通过
SendInput实现跨进程操作 - 文件管理采用
SHFileOperation确保Unicode兼容 - 进程管理通过WMI查询获取安装程序列表
3. 从安装到实战:手把手配置你的AI助手
3.1 环境准备与编译指南
硬件要求:
- 支持AVX指令集的CPU(2013年后大多数Intel/AMD处理器)
- 独立显卡(集成显卡也可运行但截图速度较慢)
- 至少4GB空闲内存(处理大尺寸截图时需求增加)
软件依赖:
- Visual Studio 2022(社区版即可)
- Windows SDK 10.0.19041.0或更高
- CMake 3.20+
编译步骤:
bash复制git clone https://github.com/yunsjxh/Open-Aries-AI.git
cd Open-Aries-AI
mkdir build && cd build
cmake .. -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release
常见编译问题解决:
- GDI+链接错误:确保安装时勾选了"Windows通用C运行时"
- CMake找不到VS:使用
-G参数明确指定生成器版本 - 缺少windows.h:检查SDK版本是否安装完整
3.2 首次运行配置
首次启动时需要配置三个关键参数:
-
API密钥设置
- 支持智谱AI、OpenAI等多种提供商
- 密钥采用DPAPI加密存储在当前用户凭据中
- 可通过
config.ini修改默认模型参数
-
安全权限调整
- 管理员权限请求(用于跨进程输入模拟)
- 防病毒软件白名单设置(部分行为可能被误判)
- 高危操作二次确认开关
-
性能调优
- 截图质量与间隔设置(默认500ms)
- 动作执行延迟调节(模拟人类操作速度)
- 历史记忆长度配置(影响上下文窗口)
实测技巧:在1440p分辨率下,将截图质量调整为70%可以显著降低API调用延迟,同时保持足够的识别精度。
4. 实战案例:看AI如何完成复杂工作流
4.1 文件管理自动化
指令示例:
"整理我的下载文件夹,将所有图片移动到Pictures下的对应年月子文件夹,文档按类型分类到Documents,压缩包放到Archives"
AI执行过程:
- 截图分析下载文件夹内容
- 识别文件类型和创建日期
- 生成目录树结构
- 按规则执行批量移动操作
- 最后生成操作报告
关键技术点:
- 使用
FindFirstFile/FindNextFile遍历目录 - 通过文件头识别真实类型(不依赖扩展名)
- 处理长路径名(超过MAX_PATH)的特殊逻辑
- 操作冲突解决策略(同名文件处理)
4.2 应用程序自动化控制
典型场景:
"用Excel打开我最近修改的CSV文件,将第二列数据生成折线图,保存为PNG到桌面"
执行细节:
- 通过WMI查询最近修改的.csv文件
- 启动Excel进程并发送DDE命令打开文件
- 模拟快捷键操作生成图表
- 使用Excel另存为对话框导出图片
- 验证输出文件完整性
避坑指南:
- 不同Office版本的DDE命令差异
- 处理Excel启动时的许可协议弹窗
- 多显示器环境下的窗口定位问题
- 处理语言区域差异导致的菜单文本变化
5. 深度优化与问题排查
5.1 性能瓶颈分析
通过VTune采集的典型性能数据:
| 操作类型 | 平均耗时(ms) | 主要瓶颈 |
|---|---|---|
| 全屏截图(1080p) | 12.3 | GDI位图转换 |
| 图像编码(PNG) | 8.7 | CPU压缩算法 |
| API调用(智谱) | 320-500 | 网络延迟 |
| 输入模拟(点击) | 1.2 | 系统消息队列 |
优化手段:
- 采用差分截图(仅捕获变化区域)
- 实验性支持DirectX屏幕捕获(游戏窗口优化)
- 请求批处理(合并多个小操作)
- 本地缓存常见界面元素模板
5.2 常见故障排除
问题1:AI无法识别特定应用程序界面
- 检查:是否启用了DPI缩放(建议设为100%)
- 尝试:调整截图色深(某些程序使用自定义渲染)
- 终极方案:手动标注控件位置生成模板
问题2:输入操作执行不准确
- 验证:窗口焦点状态(
GetForegroundWindow) - 检查:系统键盘布局和输入法状态
- 调试:使用
spy++查看实际收到的消息
问题3:长时间运行后内存增长
- 监控:
Process Explorer查看堆分配 - 注意:GDI对象泄漏(常见于截图失败时)
- 解决方案:定期调用
GdiFlush释放资源
6. 安全机制深度解析
6.1 数据安全设计
凭证存储方案:
- 使用
CryptProtectData进行用户级加密 - 内存中的密钥最长存活时间≤2分钟
- 所有API请求强制HTTPS+证书固定
操作审计日志:
plaintext复制[2026-04-15 14:32:18] ACTION: FileMove
SRC: C:\Users\test\Desktop\*.png
DST: D:\test\
CONFIRM: User approved via dialog
HASH: a1b2c3d4... (SHA-256 of action params)
6.2 权限控制模型
采用三级安全策略:
-
基础操作
- 文件浏览
- 应用程序查询
- 系统信息获取
- 自动批准执行
-
敏感操作
- 文件修改/删除
- 注册表访问
- PowerShell执行
- 需要显式确认
-
高危操作
- 系统关机/重启
- 用户账户变更
- 网络配置修改
- 默认禁用,需手动开启
7. 扩展开发指南
7.1 插件系统设计
项目预留了三种扩展方式:
1. 动作扩展(Action Plugin)
cpp复制class IActionPlugin {
public:
virtual std::string GetActionName() = 0;
virtual bool Execute(const json& params) = 0;
virtual bool ShouldIntercept(const std::string& cmd) = 0;
};
2. AI提供方扩展(AI Provider)
cpp复制class IAIModelProvider {
public:
virtual std::string SendPrompt(
const std::string& prompt,
const std::vector<Image>& screenshots) = 0;
};
3. 界面识别器(UI Recognizer)
cpp复制class IUIRecognizer {
public:
virtual ControlTree Analyze(const Image& screenshot) = 0;
};
7.2 自定义提示词工程
系统采用模块化提示设计,核心模板包括:
主决策模板(decision.jinja2)
jinja2复制{{ history }}
当前屏幕内容:{{ screenshot_description }}
用户指令:{{ command }}
请分析:
1. 当前可操作的元素有哪些?
2. 下一步最合理的动作是什么?
3. 需要特别注意什么?
文件操作校验模板(safety_check.jinja2)
jinja2复制即将执行批量文件操作:
{{ file_list | join('\n') }}
请确认:
1. 这些操作是否符合用户意图?
2. 是否存在潜在风险?
3. 是否需要特别确认?
8. 未来演进路线
8.1 短期优化方向
性能提升:
- 实验性支持DirectML加速图像处理
- 流式传输截图数据(减少内存占用)
- 本地轻量模型辅助决策(减少API调用)
稳定性增强:
- 操作回滚机制(针对文件修改类操作)
- 异常状态自动恢复
- 更精细的进程监控
8.2 中长期规划
多模态融合:
- 集成OCR识别(处理文字型界面)
- 添加语音交互通道
- 支持3D应用界面解析(游戏/建模软件)
认知能力升级:
- 长期记忆存储(用户习惯学习)
- 技能库扩展(可训练专用工作流)
- 多AI协作决策(专精模型组合)
在开发过程中最让我惊喜的是,当AI第一次成功完成"打开音乐播放器→搜索特定歌曲→创建播放列表"这一系列操作时,那种仿佛赋予了电脑生命的成就感。这只是一个起点,我期待看到社区能一起推动这个项目走向更智能的未来。
