仅从窗口捕获像素数据

问题描述 投票:1回答:1

我希望下面的代码仅截取指定窗口的屏幕快照,因为这样BitBlt更快。尝试将屏幕截图粘贴到MS Paint中后,我只得到了黑色矩形。

-(矩形的尺寸似乎是正确的,与给定窗口的分辨率匹配。)

#include<iostream>
#include<Windows.h>

int main() {

    HWND wnd = FindWindow(NULL, "name_of_window - Google Chrome");
    if (!wnd) {
        return 0;
    }
    RECT rect;
    GetWindowRect(wnd, &rect);

    int width = rect.right - rect.left;
    int height = rect.bottom - rect.top;


    // copy screen to bitmap
    HDC     hScreen = GetWindowDC(wnd);
    HDC     hDC = CreateCompatibleDC(hScreen);
    HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, width, height);
    HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
    BOOL    bRet = BitBlt(hDC, 0, 0, width,height, hScreen, 0, 0, SRCCOPY);

    // save bitmap to clipboard
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBitmap);
    CloseClipboard();

    // clean up
    SelectObject(hDC, old_obj);
    DeleteDC(hDC);
    ReleaseDC(NULL, hScreen);
    DeleteObject(hBitmap);
}

c++ bitmap screen-capture bitblt dc
1个回答
0
投票

我认为问题在于您执行工作的顺序。

在将位图放置在剪贴板上之前,应从存储设备上下文中选择它。

一旦将位图放置在剪贴板上,您将不再拥有它,因此您不应尝试删除它。

最好的方法可能是将// clean up部分移到// save bitmap to clipboard部分之前,并消除DelectObject(hBitmap)语句。因此,您的代码的结尾可能应该是:

BitBlt(hDC, 0, 0, width, height, hScreen, 0, 0, SRCCOPY);

// clean up
SelectObject(hDC, old_obj); // selects hBitmap out of hDC
DeleteDC(hDC);
ReleaseDC(NULL, hScreen);

// save bitmap to clipboard
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);  // clipboard now owns the bitmap
CloseClipboard();

如果这些更改后您仍然有问题,我将检查SetClipboardData调用的返回值。如果失败,GetLastError可能会提供线索。

© www.soinside.com 2019 - 2024. All rights reserved.