lengshizai 2024-04-10 22:23 采纳率: 31.7%
浏览 6
已结题

C++后台循环截屏代码收集

请参照我上一篇问题给出一个解决方案代码
实现目的:循环截取指定窗口的图像并保存到本地
要求:
1.截屏高效
2.留出我操作的代码区域并标识
3.给代码添加基本注解 以便于我对照学习并找出我的错误。

由于我的后台截屏代码太长,请翻阅上篇提问。

  • 写回答

16条回答 默认 最新

  • 普通 网友 2024-04-10 22:24
    关注

    以下参考免费微信小程序:皆我百晓生 作答,并由妄北y整理回复。

    为了实现循环截取指定窗口的图像并保存到本地的功能,我们可以使用Windows API。以下是一个简单的C++代码示例,它使用PrintWindow函数来截取指定窗口的图像,并将其保存为PNG文件。

    #include <Windows.h>
    #include <vector>
    #include <Capture.h>
    #include <Pathcch.h>
    #include <fstream>
    
    // 函数声明
    bool CaptureWindow(HWND hWnd, const std::wstring& filePath);
    
    int main() {
        // 你的代码区域开始
        // 请在这里设置循环逻辑,例如设置一个定时器每隔一段时间调用CaptureWindow函数
        // 例如:每5秒截一次屏,你可以使用Sleep函数来实现等待
        while (true) {
            // 假设我们要截取的窗口句柄是已知的,这里用hWnd代替
            HWND hWnd = /* 你的窗口句柄获取代码 */;
            
            // 设置文件名,例如使用当前时间戳
            std::wstring filePath = L"screenshot_" + std::to_wstring(GetTickCount()) + L".png";
            
            // 调用截屏函数
            if (CaptureWindow(hWnd, filePath)) {
                // 截屏成功,可以在这里添加你的代码
            } else {
                // 截屏失败,可以在这里添加错误处理代码
            }
            
            // 等待一段时间再次截屏
            Sleep(5000); // 5000毫秒,即5秒
        }
        // 你的代码区域结束
    
        return 0;
    }
    
    // 截屏并保存为PNG文件的函数
    bool CaptureWindow(HWND hWnd, const std::wstring& filePath) {
        // 声明内存设备上下文(DC)
        HDC hMemDC = CreateCompatibleDC(NULL);
        if (!hMemDC) return false;
    
        // 使用PrintWindow函数截取窗口
        HBITMAP hBitmap = (HBITMAP)PrintWindow(hWnd, hMemDC, PW_CLIENTONLY);
        if (!hBitmap) {
            DeleteDC(hMemDC);
            return false;
        }
    
        // 创建一个与位图兼容的DC
        HDC hDC = CreateCompatibleDC(NULL);
        if (!hDC) {
            DeleteObject(hBitmap);
            DeleteDC(hMemDC);
            return false;
        }
    
        // 将位图选入新创建的DC
        HGDIOBJ hOldBitmap = SelectObject(hDC, hBitmap);
    
        // 获取位图信息
        BITMAP bmp;
        GetObject(hBitmap, sizeof(BITMAP), &bmp);
    
        // 创建一个临时路径用于保存截屏
        wchar_t tempPath[MAX_PATH];
        if (!GetTempPathW(MAX_PATH, tempPath)) {
            SelectObject(hDC, hOldBitmap);
            DeleteObject(hBitmap);
            DeleteDC(hMemDC);
            DeleteDC(hDC);
            return false;
        }
    
        // 拼接临时文件名
        wstring tempFileName = L"temp_screenshot.png";
        wstring tempFilePath = tempPath + L"\\" + tempFileName;
    
        // 保存位图到文件
        GUID encoder = { 0x557cf400, 0x1a2b, 0x48a7, { 0x8f, 0x9c, 0x7a, 0x7e, 0xf7, 0x67, 0x6d, 0xee } };
        HRESULT hr = SaveHbitmapAsPng(hDC, hBitmap, tempFilePath.c_str(), &encoder);
        if (hr != S_OK) {
            SelectObject(hDC, hOldBitmap);
            DeleteObject(hBitmap);
            DeleteDC(hMemDC);
            DeleteDC(hDC);
            return false;
        }
    
        // 将临时文件移动到目标路径
        MoveFileW(tempFilePath.c_str(), filePath.c_str());
    
        // 清理资源
        SelectObject(hDC, hOldBitmap);
        DeleteObject(hBitmap);
        DeleteDC(hMemDC);
        DeleteDC(hDC);
    
        return true;
    }
    
    // 将HBITMAP保存为PNG文件的辅助函数
    HRESULT SaveHbitmapAsPng(HDC hDC, HBITMAP hBitmap, LPCWSTR pszFilePath, const GUID* pEncoder) {
        // 创建一个IWICImagingFactory接口实例
        IWICImagingFactory* pWICFactory = NULL;
        HRESULT hr = CoCreateInstance(
            CLSID_WICImagingFactory,
            NULL,
            CLSCTX_INPROC_SERVER,
            IID_IWICImagingFactory,
            (LPVOID*)&pWICFactory
        );
        if (FAILED(hr)) return hr;
    
        // 创建一个IWICBitmap对象
        IWICBitmap* pWICBitmap = NULL;
        hr = pWIC
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(15条)

报告相同问题?

问题事件

  • 系统已结题 4月20日
  • 已采纳回答 4月12日
  • 创建了问题 4月10日

悬赏问题

  • ¥15 软件工程用例图的建立(相关搜索:软件工程用例图|画图)
  • ¥15 如何在arcgis中导出拓扑关系表
  • ¥15 处理数据集文本挖掘代码
  • ¥15 matlab2017
  • ¥15 在vxWorks下TCP/IP编程,总是connect()报错,连接服务器失败: errno = 0x41
  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3