仅截图窗口的特定区域

时间:2015-01-08 10:02:05

标签: c++ winapi screenshot

我目前正在使用以下代码行截取窗口:

UpdateWindow(hwnd);
HDC window_dc = GetDC(hwnd);
HDC res = CreateCompatibleDC(window_dc);
RECT r;
GetClientRect(hwnd, &r);
HBITMAP bmp = CreateCompatibleBitmap(window_dc, r.right - r.left, r.bottom - r.top);
SelectObject(res, bmp);
PrintWindow(hwnd, res, PW_CLIENTONLY);
DeleteObject(bmp);
ReleaseDC(hwnd, window_dc);

现在有办法,只截图我的HWND的特定区域?我意识到,在某些应用程序中,当窗口稍微大一点时,截图会花费更长的时间。所以我想如果我只能截取重要的帧,我就能真正提高速度。

编辑:它需要适用于后台的窗口,例如。与其他窗户重叠。

1 个答案:

答案 0 :(得分:1)

你可以这样试试:

bool ScreenShot(HWND hwnd, int x, int y, int w, int h, LPCSTR file){
    HDC source = GetDC(hwnd);
    HDC memory = CreateCompatibleDC(source);

    HBITMAP bitmap = CreateCompatibleBitmap(source, w, h);
    HBITMAP bitmapOld = (HBITMAP)SelectObject(memory, hBitmap);

    BitBlt(memory, 0, 0, w, h, source, x, y, SRCCOPY);
    hBitmap = (HBITMAP)SelectObject(memory, bitmapOld);

    DeleteDC(source);
    DeleteDC(memory);

    HPALETTE pal = NULL;
    if(saveBitmap(file, bitmap, pal)) return true;
    return false;
}