窗口截图接口
版本:1.26.0613
提供后台窗口截图功能,基于 PrintWindow API 实现。即使目标窗口被遮挡、最小化或在后台,也能获取其客户区内容。适用于游戏自动化脚本中对特定窗口进行截图后做 OCR 识别或模板匹配找图。
CaptureWindow
cpp
EXPORT_DLL_API int CaptureWindow(const char* windowTitle, const char* outputPath);功能:根据窗口标题查找窗口,对其客户区进行后台截图并保存到文件。
| 参数 | 类型 | 说明 |
|---|---|---|
windowTitle | 输入 | 窗口标题(UTF-8 编码),如 "Notepad"、"计算器" |
outputPath | 输入 | 截图保存路径,如 "C:/screenshot.png" |
返回值示例:
| 值 | 含义 |
|---|---|
0 | 成功,截图已保存 |
-1 | 参数为空(windowTitle 或 outputPath 为 nullptr) |
-2 | 未找到匹配窗口(FindWindowA 返回 NULL) |
调用示例:
cpp
int ret = CaptureWindow("计算器", "calc.png");
if (ret == 0) {
printf("截图成功\n");
const char* text = ocrv4DetectParam("calc.png", 0.5f, 50, 1024, 0.3f, 1.6f, 0, 0);
printf("识别结果: %s\n", text);
}CaptureWindowByHandle
cpp
EXPORT_DLL_API int CaptureWindowByHandle(long long hwnd, const char* outputPath);功能:根据窗口句柄直接截图。适用于通过其他方式(如 FindWindow、窗口枚举、鼠标取点等)获取句柄后截图。
| 参数 | 类型 | 说明 |
|---|---|---|
hwnd | 输入 | 窗口句柄(long long 类型,传 HWND 值即可) |
outputPath | 输入 | 截图保存路径 |
返回值示例:
| 值 | 含义 |
|---|---|
0 | 成功,截图已保存 |
-1 | 参数为空(outputPath 为 nullptr) |
-2 | 无效窗口句柄(IsWindow 返回 FALSE) |
-3 ~ -9 | 内部错误(DC 创建失败、像素提取失败、保存失败等) |
调用示例:
cpp
HWND hWnd = FindWindowA(NULL, "计算器");
if (hWnd) {
int ret = CaptureWindowByHandle((long long)hWnd, "calc.png");
if (ret == 0) {
printf("截图成功\n");
}
}后台截图原理
CaptureWindow("标题") / CaptureWindowByHandle(hwnd)
│
▼
GetClientRect(hWnd) ← 获取客户区尺寸
│
▼
PrintWindow(hWnd, hMemDC) ← 后台截图(核心 API)
│
├── 成功 → 提取像素(GetDIBits)
└── 失败 → 回退 BitBlt(窗口可能不兼容 PrintWindow)
│
▼
cv::Mat(BGRA→BGR) + imwrite ← OpenCV 保存
│
▼
返回 0(成功)或负值(失败)| 技术点 | 说明 |
|---|---|
PrintWindow | 发送 WM_PRINT 消息,窗口自己绘制到 DC,不受遮挡/最小化影响 |
PW_CLIENTONLY | 只截取客户区(不含标题栏/边框) |
回退 BitBlt | 对 DirectX 等不响应 WM_PRINT 的窗口,尝试前台截图(可能截到遮挡内容) |
| 32 位 DLL | ✅ 完全兼容 Windows GDI API |
与现有接口配合
窗口截图常与以下接口配合形成自动化链路:
CaptureWindow → 截图文件 → templateMatch (找图)
CaptureWindow → 截图文件 → ocrv4Detect (OCR)
CaptureWindow → 截图文件 → findColor (找色)
CaptureWindow → 截图文件 → yolov8Detect (目标检测)