Skip to content

窗口截图接口

版本: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     (目标检测)