【问题标题】:Only screenshot a specific area of a window只截取窗口的特定区域
【发布时间】:2015-01-08 10:02:05
【问题描述】:

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

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 的特定区域?我意识到,在某些应用程序中,当窗口稍微大一点时,截屏时间会明显延长。所以我想如果我只能截图重要的帧,我真的可以提高我的速度。

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

【问题讨论】:

  • 句柄hwnd指的是什么?整个桌面还是只是一个特定的窗口?
  • 只是一个特定的窗口。

标签: c++ winapi screenshot


【解决方案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;
}

【讨论】:

  • 这是否适用于与其他窗口重叠的窗口?对不起,我忘了提。
  • 虽然我不确定这一点,但我对此表示怀疑。这个函数只是将像素从上下文复制到另一个。但试一试。我几乎不在办公室,否则我会;-)
猜你喜欢
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多