SamAI-AimBot 是一套基于 ONNX Runtime 的 AI 实时目标检测与视觉辅助瞄准系统。它以 DXGI Desktop Duplication 直接从 GPU 显存抓取桌面画面,送入 YOLO 系列 ONNX 模型完成推理,再通过 SendInput 或 KMBox-Net 硬件设备执行鼠标移动,形成「截图 → 推理 → 决策 → 移动」的完整闭环。
全部界面基于 Dear ImGui(DX11 + Win32 后端)实现,参数实时可调并持久化到 INI 配置文件。
🎯 双捕获后端(WIN32 GDI / DXGI)、双推理后端(CUDA / CPU 自动降级)、双移动后端(系统 API / 硬件盒)均可切换。
| 截图后端 | 技术 | 特点 | 适用场景 |
|---|---|---|---|
| DXGI | IDXGIOutputDuplication |
从 GPU 显存直接复制,只回读屏幕中心区块,CPU 拷贝量最小 | 追求低延迟的首选方案 |
| WIN32 | GDI BitBlt |
CPU 管线,兼容性最好,无需 D3D11 设备 | 默认方案/DXGI 不可用时兜底 |
DXGI 模式的关键优化:
- 只把屏幕中心的
imgsize × imgsize区块从桌面帧拷到 staging 纹理,而不是整屏拷贝,显著降低 GPU→CPU 回读量 - 逐行拷贝时按 staging 纹理的真实
RowPitch对齐,避免行间距错位 - 捕获失效自动在线重建:串流启停、显示模式切换(如
Win+P)、设备移除会导致 Duplication 失效,程序检测到DXGI_ERROR_ACCESS_LOST/DXGI_ERROR_DEVICE_REMOVED或长时间无新帧后,会自动释放并重建捕获,无需重启进程 - 重建失败按固定间隔退避重试,覆盖串流切换期间的短暂不可用窗口
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Capture │ ──▶ │ Inference │ ──▶ │ Aim + Move │
│ DXGI/GDI │ │ ONNX Runtime│ │ SendInput/ │
│ 裁剪回读 │ │ CUDA / CPU │ │ KMBox-Net │
└─────────────┘ └─────────────┘ └─────────────┘
- 优先使用 CUDA 执行提供者,加载失败时自动重试 CPU,全程无需人工干预
- 界面明确显示当前实际生效的后端(
backend_active_ep) - 两种后端均失败时记录失败原因(
backend_last_error)并安全退出,避免用空指针继续推理 - 支持多模型尺寸(256 / 320 / 416 / 480 / 512 / 640),小尺寸延迟更低、大尺寸精度更高
| 移动后端 | 说明 |
|---|---|
| SendInput | 系统级 SendInput 注入,零额外硬件 |
| KMBox-Net | 通过 UDP 网络协议驱动外置硬件盒,支持加密封包与硬件级轨迹修正 |
- YOLO 系列 ONNX 模型实时目标检测
- CUDA / CPU 双执行提供者,加载失败自动降级
- 置信度阈值
conf可调 + IOUiou去重 - 类别过滤(
enableClassFilter+classFilterIndex) - 模型文件运行时切换(
mode_llist) - 多模型输入尺寸可选(
captureSizeTable = { 320, 416, 640, 960 })
- DXGI Desktop Duplication(GPU 显存直接复制)
- WIN32 GDI
BitBlt后端 - 界面下拉框实时切换监视方式
- 捕获失效自动在线重建(串流切换 / 显示模式变更)
- 分辨率自动获取或手动指定
- 多热键触发:左 / 右 / 中 / 侧键1 / 侧键2 独立开关
- 瞄准总开关
aimAssist - 三级灵敏度:常规
sens1/ 瞄准sens2/ 瞄准镜sens3 - PID 平滑系数
X_pid_d/Y_pid_d独立可调 - 贝塞尔曲线类人移动(
isBezier+BezierMouseSmoother.h) - 移动频率与延迟控制:
steps/delay - 瞄准偏移量
head_y、搜索范围searchRange - 平滑度
smooth
- 压枪开关
compensationEnabled - 补偿强度
compensation与累积模式compensationAccumulate - 子弹休眠
compensationSleepMs、峰值compensationMax、下压像素compensationDownPx
- UDP 网络通信 + 加密封包(
my_enc) - 硬件级鼠标移动 / 按键 / 滚轮 / 键盘注入
- 硬件轨迹修正(
traceType选择方式 +traceValue平滑度) - 物理鼠标键盘状态监听线程(
kmNet_monitor) - IP / Port / UUID 界面可配置并持久化
- 自瞄间隔延迟
kmBoxDelay防抖
- DirectX 11 渲染的控制面板
- 监视方式、分辨率、模型、灵敏度、压枪、热键集中配置
- 模型加载失败原因实时显示
- KMBox-Net 连接状态提示
- 配置保存 / 加载(INI 格式)
- 开关
monitorEnabled后用 OpenCV 窗口显示 AI 视野 - 检测结果框实时叠加显示
- 捕获中断期间保持上一帧,不产生空帧崩溃
┌──────────────────────┐
│ ImGui UI 线程 │
│ (DX11 控制面板渲染) │
└──────────┬───────────┘
│ Sun 单例参数读写
┌──────────▼───────────┐
│ 主线程 │
│ - 自瞄决策 │
│ - 压枪补偿 │
│ - 鼠标移动执行 │
└──────────┬───────────┘
│
┌──────────────────────┼──────────────────────┐
│ │ │
┌──────────▼──────────┐ ┌────────▼────────┐ ┌──────────▼──────────┐
│ 捕获线程 │ │ 推理线程 │ │ 移动后端 │
│ (g_aiThread) │ │ (ONNX Runtime) │ │ │
│ DXGI / WIN32 │ │ CUDA / CPU │ │ SendInput │
│ → 裁剪帧缓冲 │ │ → Box[] 后处理 │ │ KMBox-Net (UDP) │
└─────────────────────┘ └─────────────────┘ └─────────────────────┘
| 线程 | 职责 |
|---|---|
| 主线程 | 全局鼠标钩子 MouseHookProc 捕获热键、压枪补偿计算、移动指令下发 |
推理线程 g_aiThread |
循环抓帧 → 推理 → 后处理,按 captureMethod 分派到 bitmainDxgi / bitmainWin32 |
输入线程 g_ShooterThread |
按键注入与移动执行 |
| KMBox 监听线程 | kmNet_monitor 接收硬件盒上报的物理键鼠状态 |
DXGI 捕获采用三态返回,取代原先「超时也当作成功」的处理方式:
| 状态 | 含义 | 处理 |
|---|---|---|
| 新帧 | 成功取到桌面帧 | 刷新双缓冲,推进帧序号 |
| 无新帧 | 桌面无变化(超时) | 保持上一帧,不刷新缓冲 |
| 捕获失效 | ACCESS_LOST / 设备移除 / 长期无帧 |
释放资源并触发在线重建 |
该设计同时解决了两个问题:串流中断时不再抛出
0xC000000D异常;串流建立后监控画面会自动恢复刷新,不会停留在旧帧。
| 库 | 版本 / 文件 | 用途 |
|---|---|---|
| ONNX Runtime | lib/onnxruntime.lib(头文件在 dml/) |
模型推理,支持 CUDA / CPU 执行提供者 |
| OpenCV | lib/opencv_world490.lib / .dll(4.9.0) |
图像处理、监视窗口显示(cv::imshow) |
| Dear ImGui | imgui/(DX11 + Win32 后端) |
控制面板 UI |
| Direct3D 11 / DXGI | 系统组件 | DXGI 捕获、ImGui 渲染 |
| Winsock2 | ws2_32.lib |
KMBox-Net UDP 通信 |
| Windows Multimedia | winmm.lib |
多媒体计时 |
- Windows 10 / 11(x64)
- Visual Studio 2022(含 C++ 桌面开发工作负载)
- Windows SDK 10.0
- 显卡驱动支持 CUDA(若使用 GPU 推理)
- 用 Visual Studio 打开
SamAI.sln - 选择配置 x64 | Debug 或 x64 | Release
- 确认
lib/目录下已存在onnxruntime.lib、opencv_world490.lib、opencv_world490.dll - 生成解决方案
| 配置项 | 值 | 说明 |
|---|---|---|
| 平台配置 | x64(Debug / Release) | 需 x64 才能使用 DML / CUDA 相关能力 |
| C++ 语言标准 | stdcpp17 |
|
| 子系统 | Console |
控制台窗口承载日志输出 |
| 执行级别 | RequireAdministrator |
必须以管理员权限运行,否则钩子与注入可能失效 |
| 附加包含目录 | $(ProjectDir)、$(ProjectDir)dml |
|
| 附加库目录 | $(ProjectDir)lib |
程序运行目录下需能访问:
lib/opencv_world490.dll(OpenCV 动态库)onnx/(模型文件目录)- 可写入的 INI 配置文件
- 将
.onnx模型文件放入项目根目录的onnx/文件夹 - 在界面「模型选择」下拉框中选取所需模型
- 输入尺寸选择原则:
| 输入尺寸 | 特点 | 建议场景 |
|---|---|---|
| 256 / 320 | 延迟最低,显存占用小 | 追求响应速度 |
| 416 / 480 / 512 | 速度与精度均衡 | 通用场景 |
| 640 | 精度最高,延迟相对较大 | 小目标、远距离目标 |
onnx/目录下常见命名包含尺寸标记(如*_256、*_320、*_416、*_512、*_640),同一模型的多个尺寸版本可分别放入并切换对比。
- 模型输入尺寸需与显存、屏幕分辨率综合权衡;截取区域大小由
captureSizeTable决定
推理后处理会按输出张量形状自动识别模型格式,无需手动指定版本:
| YOLO 版本 | 输出布局 | 头部特征 | 说明 |
|---|---|---|---|
| YOLOv5 / v7 | [1, N, 5+C] |
含 objectness 通道 | 行 = 候选框;列 = [cx, cy, w, h, objectness, class...],按类别逐个判定 |
| YOLOv8 / v11 | [1, C, N] |
无 objectness 通道 | 转置布局,前置 4 通道为 cx, cy, w, h,其后为各类别分数,每个候选取最优类别 |
| 端到端 / 角点格式 | [N, 6] |
[x1, y1, x2, y2, score, cls] |
模型已内置 NMS,每行即一个检测框,通过采样多数表决识别 |
判定逻辑位于
dml/module2.h的postProcess():先对前若干行采样做角点格式多数表决,再以out1 >= out2区分[1, N, 5+C]与[1, C, N]两类布局。
- 以管理员身份运行
SamAI.exe - 在 ImGui 面板中选择「监视方式」:
WIN32(默认)或DXGI - 设置屏幕分辨率:
- 勾选自动分辨率,由
GetSystemMetrics读取当前屏幕 - 或取消勾选后手动输入宽 / 高
- 也可直接选择预设(1080p / 2K / 1600p / 4K)
- 勾选自动分辨率,由
- 选择 AI 模型 文件
- 配置 KMBox-Net(若使用硬件盒):
- 在 IP / Port / UUID 输入框填入设备参数(示例格式:
192.168.x.x/<Port>/<UUID>) - 点击「连接 KMBox-Net」,状态提示变为「已连接」
- 在 IP / Port / UUID 输入框填入设备参数(示例格式:
- 调整灵敏度、置信度、压枪等参数
- 勾选瞄准热键后点击开始,程序进入 AI 循环
| 目标 | 调整项 |
|---|---|
| 响应更快 | 降低模型输入尺寸;减小 delay;提高灵敏度 |
| 移动更平滑 | 提高 smooth;启用贝塞尔曲线;增大 steps |
| 减少误检 | 提高 conf;启用类别过滤并指定 classFilterIndex |
| 压枪更稳 | 调整 compensationSleepMs 与 compensationMax |
| 硬件轨迹更自然 | 设置 traceType 轨迹方式,调整 traceValue 平滑度(0 为关闭) |
- 串流软件启停、切换显示模式、独占全屏切换都会使 Desktop Duplication 失效;程序会自动重建捕获,期间监控画面保持上一帧,恢复后自动继续刷新
- 若长时间无法取到新帧(如桌面完全静止),程序会按阈值判定捕获僵死并主动重建
- 切换到 DXGI 模式必须在点击开始之前完成(模式在启动 AI 时读取)
- 所有参数通过
ini.h的SaveConfigToIni/LoadConfigFromIni读写[Config]段 - 包含监视方式
captureMethod、截图尺寸captureSizeIndex、模型选择mode_llist、移动方式move_llist、轨迹方式traceType、KMBox-Net 连接参数等 - 修改后保存配置,下次启动自动恢复
以下参数定义于 sun.h 的 Sun 单例(Sun::Get()):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
captureMethod |
int | 0 |
监视方式:0=WIN32,1=DXGI |
captureSizeIndex |
int | 0 |
截图尺寸表索引 |
captureSizeTable[4] |
int[4] | {320,416,640,960} |
可选截图尺寸 |
conf |
float | 0.4 |
置信度阈值 |
iou |
float | 0.25 |
NMS IOU 阈值 |
mode_llist |
int | 0 |
模型选择索引 |
enableClassFilter |
bool | false |
启用类别过滤 |
classFilterIndex |
float | 0 |
过滤的类别 ID |
autoResolution |
bool | true |
自动获取屏幕分辨率 |
inputWidthText / inputHeightText |
char[5] | 空 | 手动指定宽 / 高 |
screenRes |
int | 0 |
分辨率预设索引(0=1080p,1=2K,2=4K) |
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
aimAssist |
bool | false |
瞄准总开关 |
leftButton / rightButton / middleButton |
bool | false |
左 / 右 / 中键触发 |
sideButton1 / sideButton2 |
bool | false |
侧键触发 |
sens1 / sens2 / sens3 |
float | 0.0 |
常规 / 瞄准 / 瞄准镜灵敏度 |
X_pid_d / Y_pid_d |
float | 0.0 |
X / Y 轴 PID 平滑系数 |
head_y |
float | 0.235 |
瞄准偏移量 |
searchRange |
float | 320.0 |
搜索范围 |
smooth |
float | 1.0 |
移动平滑度 |
isBezier |
bool | false |
启用贝塞尔曲线移动 |
steps |
int | 3 |
准星移动频率 |
delay |
int | 3 |
频率间隔延迟(毫秒) |
tracking_mode |
int | 1 |
目标跟踪方式 |
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
compensationEnabled |
bool | false |
压枪开关 |
compensation |
int | 0 |
压枪模式 |
compensationAccumulate |
bool | false |
压枪累积 |
compensationSleepMs |
float | 15.0 |
子弹休眠(毫秒) |
compensationMax |
float | 50.0 |
压枪峰值 |
compensationDownPx |
float | 6.0 |
下压像素 |
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
move_llist |
int | 0 |
移动方式索引 |
traceType |
int | 0 |
硬件轨迹修正方式 |
traceValue |
float | 16.0 |
轨迹平滑度(0=关闭) |
kmBoxDelay |
int | 10 |
自瞄间隔延迟(毫秒)防抖 |
net_ip / net_port / net_uuid |
char[20] | 空 | KMBox-Net 连接参数 |
netConnected |
bool | false |
是否连接硬件盒 |
backend_ep |
int | 0 |
推理后端偏好:0=CUDA,1=CPU |
backend_active_ep |
int | 0 |
实际生效后端(自动降级时与偏好不同) |
backend_load_failed |
bool | false |
模型加载是否失败 |
backend_last_error |
char[256] | 空 | 最近一次后端失败的可读原因 |
version |
double | 3.7 |
版本号 |
SamAI/
├── SamAI.sln # 解决方案文件
├── SamAI.vcxproj # 项目文件(x64,stdcpp17,Console 子系统)
├── main.cpp # 主流程:自瞄决策、压枪、线程编排、鼠标钩子
├── sun.h # 全局配置单例 Sun(Sun::Get())
├── ini.h # INI 配置持久化(Save/LoadConfigFromIni)
├── BezierMouseSmoother.h # 贝塞尔曲线平滑移动
│
├── dml/ # ONNX Runtime 推理封装
│ ├── module.cpp # IDML 类:模型加载、执行提供者、Detect 推理
│ ├── module2.h # 推理辅助实现
│ └── onnxruntime_*.h # ONNX Runtime C/C++ API 头文件
│
├── dxgi/ # DXGI Desktop Duplication 捕获
│ ├── DuplicationManager.cpp/h # 捕获管理、裁剪回读、三态状态机、在线重建
│ └── DXGIConsoleApplication.cpp/h # 抓帧与双缓冲封装
│
├── bit/ # WIN32(GDI) 截图后端
│ └── bit.h
│
├── mouse/ # 鼠标注入
│ ├── sendinput.cpp
│ └── mouse.h
│
├── NetConfig/ # KMBox-Net 硬件通信
│ ├── kmboxNet.cpp/h # UDP 协议、命令接口、状态监听线程
│ ├── my_enc.cpp/h # 加密封包
│ ├── HidTable.h # HID 键码映射表
│ └── …
│
├── imgui/ # Dear ImGui 界面
│ ├── imgui_main.cpp # 控制面板与 DX11 渲染
│ ├── imgui_impl_dx11.cpp # DX11 渲染后端
│ ├── imgui_impl_win32.cpp # Win32 平台后端
│ └── imgui*.cpp/h # ImGui 核心
│
├── nother/ # 辅助功能
│ ├── another.cpp
│ └── another.h
│
├── onnx/ # 模型文件目录(.onnx)
├── lib/ # 第三方静态/动态库
│ ├── onnxruntime.lib
│ ├── opencv_world490.lib
│ └── opencv_world490.dll
│
├── opencv2/ # OpenCV 头文件
├── fonts/ # 界面字体资源
├── pic/ # 图片资源(背景图等)
└── .github/ # 仓库配置
如果在使用过程中遇到 BUG,或对性能有 改进意见,欢迎通过邮件联系:
📧 邮箱:jinbin25@proton.me
反馈时建议附上:问题现象描述、复现步骤,以及必要的日志信息,便于快速定位问题。
本项目仅用于计算机视觉与 Windows 图形捕获技术的学习与研究,包括 DXGI Desktop Duplication API、ONNX Runtime 推理管线、Win32 输入注入机制及 ImGui 界面开发。请在符合当地法律法规与软件服务条款的前提下使用。

