如何从桌面创建点击并拖动屏幕截图?

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

屏幕截图应该能够位于任何位置并且具有任何宽度/高度。

我想仅保存 screen_dc 中的 x,y - 宽度、高度,并将该数据存储在 mem_dc 中,从 0,0 - 宽度、高度开始。

我当前的代码:

std::vector<RGBQUAD> recvScreenSnippet(int x, int y, int width, int height) {
    std::vector<RGBQUAD> v_screen_data;

    HDC const screen_dc = GetDC(NULL);
    HDC const mem_dc = CreateCompatibleDC(NULL);
    HBITMAP const hBmp = CreateCompatibleBitmap(screen_dc, width, height);
    auto const oldBmp = SelectObject(mem_dc, hBmp);

    // 32 bit & Upside Down (Y-Flipped)
    BITMAPINFO bmi{};
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biHeight = height;
    bmi.bmiHeader.biWidth = width;
    bmi.bmiHeader.biSize = sizeof(BITMAPINFO);

    // Receive pixel data from hdc
    BitBlt(mem_dc, 0, 0, width, height, screen_dc, x, y, SRCCOPY);
    GetDIBits(mem_dc, hBmp, 0, height, &v_screen_data[0], &bmi, DIB_RGB_COLORS);

    // Cleanup
    SelectObject(mem_dc, oldBmp);
    DeleteObject(hBmp);
    DeleteDC(mem_dc);
    ReleaseDC(0, screen_dc);

    return v_screen_data;
}

这应该向下和向右移动 10 像素,然后从该位置创建宽度和高度均为 30 像素的屏幕截图。

std::vector<RGBQUAD> v_screen_snippet = recvScreenSnippet(10, 10, 30, 30);

我的问题是:我做得对吗,还是我对 BitBlt 的理解错误,因为我见过很多例子,其中偏移量已插入到第一个参数中,而不是最后一个参数中。

BitBlt(mem_dc, CONFUSING, CONFUSING, width, height, screen_dc, CONFUSING, CONFUSING, SRCCOPY);

我已阅读文档,但我仍然很困惑,我将不胜感激。

我尝试更改周围的参数,但仍然很困惑。

c++ winapi bitblt
© www.soinside.com 2019 - 2024. All rights reserved.