代码之家  ›  专栏  ›  技术社区  ›  Oliver

覆盖/最小化窗口的屏幕截图

  •  3
  • Oliver  · 技术社区  · 16 年前

    我有以下代码来截取一个窗口的屏幕截图:

    HDC WinDC;
    HDC CopyDC;
    HBITMAP hBitmap;
    RECT rt;
    
    GetClientRect (hwnd, &rt);
    WinDC = GetDC (hwnd);
    CopyDC = CreateCompatibleDC (WinDC);
    
    hBitmap = CreateCompatibleBitmap (WinDC,
     rt.right - rt.left, //width
     rt.bottom - rt.top);//height
    
    SelectObject (CopyDC, hBitmap);
    
    //Copy the window DC to the compatible DC
    BitBlt (CopyDC,   //destination
     0,0,
     rt.right - rt.left, //width
     rt.bottom - rt.top, //height
     WinDC,    //source
     0, 0,
     SRCCOPY);
    
    ReleaseDC(hwnd, WinDC);
    ReleaseDC(hwnd, CopyDC);
    

    当一个窗口稍微覆盖另一个窗口时,覆盖窗口会出现在被覆盖窗口的截图上,这有点不方便。另外,当窗口最小化时,此代码不会产生任何有趣的结果。

    有什么办法吗?我可以想象,截取一个最小化的应用程序的屏幕截图将是相当困难的,但我希望获得覆盖窗口的屏幕截图是可能的。也许有一种不同的方法来解决这些问题?

    1 回复  |  直到 16 年前
        1
  •  4
  •   Hans Passant    16 年前

    不,截图就是它听起来的样子。你将从视频适配器中读出像素,得到的就是你看到的。你必须把窗口恢复到前台才能看到全景。WM\u SYSCOMMAND+SC\u RESTORE和setforegroundindow()分别。再加上一些时间,以便应用程序在必要时重新绘制其窗口。

    WM\u PRINT消息可用于请求窗口将其自身绘制到内存上下文中。可以解决重叠窗口的问题。但这只能在你的窗口工作。而且很少有预期的结果,程序员经常不能正确地实现WM\u PRINT。