在 MFC (C++) 中捕获并保存窗口的屏幕截图

Posted

技术标签:

【中文标题】在 MFC (C++) 中捕获并保存窗口的屏幕截图【英文标题】:Capture and Save the Screenshot of a Window in MFC (C++) 【发布时间】:2021-02-01 06:17:28 【问题描述】:

我想在 MFC 中捕获窗口的屏幕截图并将其保存为图像文件。按照例子,我得到了如下的东西

OnSave()

    CRect rect;
    GetWindowRect(&rect);
    CImage* img = new CImage();
    img->Create(rect.Width(), rect.Height(), 32);
    HDC device_context_handle = img->GetDC();
    HWND hwnd = this->GetSafeHwnd();
    bool IsPrint =::PrintWindow(hwnd, device_context_handle, PW_CLIENTONLY);
    HRESULT res = img->Save(L"image12.bmp", Gdiplus::ImageFormatBMP);
    img->ReleaseDC();

    delete img;

这样做,我得到了正确尺寸的文件,但它总是黑色的。我检查了结果保存(res)也始终为0。我尝试在线检查不同的示例,但无法修复此黑色图像问题。有没有建议修改或以不同的方式执行此操作?

【问题讨论】:

您的目标窗口是否处理WM_PRINT 消息?不相关,但由于您要求仅打印客户区域,因此您的目标图像的大小应调整为客户矩形而不是窗口矩形(如代码所示)。 【参考方案1】:

类似下面的东西应该这样做

    int x1, y1, x2, y2, w, h;

    // get window dimensions for following vars.
    // Don.t know if you want all area or just client area,
    // so use GetClientRect or GetWindowRect accordingly.
    // These functions sometimes are not so obvious on what they do.
    x1 = /**/;
    y1 = /**/;
    x2 = /**/;
    y2 = /**/;

    // width and height
    w = x2 - x1;
    h = y2 - y1;

    // copy window to bitmap
    HDC     hWindow = (HDC) window.GetDC();
    HDC     hDC = CreateCompatibleDC(hWindow);
    HBITMAP hBitmap = CreateCompatibleBitmap(hWindow, w, h);
    HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
    BOOL    bRet = BitBlt(hDC, 0, 0, w, h, hWindow, x1, y1, SRCCOPY);
    
    CImage image;
    image.Attach(hBitmap);
    image.Save(debug_dir + L"window.bmp", Gdiplus::ImageFormatBMP);

    // clean-up
    SelectObject(hDC, old_obj);
    DeleteDC(hDC);
    ::ReleaseDC(NULL, hWindow);
    DeleteObject(hBitmap);

【讨论】:

以上是关于在 MFC (C++) 中捕获并保存窗口的屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中发送屏幕截图流

如何使用 MFC 处理单独的窗口?

使用 C# 中的 C++ 类

从选定的最小化窗口捕获屏幕截图

如何在不调整窗口大小的情况下使用 Java 在 Selenium Webdriver 中捕获屏幕截图 [重复]

如何捕获画布的屏幕截图 [重复]