【问题标题】:Getting screenshot of a child window running OpenGL in it (Windows)获取在其中运行 OpenGL 的子窗口的屏幕截图(Windows)
【发布时间】:2010-01-27 00:56:01
【问题描述】:

我有一个带孩子的主窗口。我需要以编程方式截取屏幕截图以裁剪并将它们绘制回我的主窗口。我这样做的方法是:

HDC hDC = GetWindowDC(hWnd);
HDC memDC = CreateCompatibleDC(hDC);
HBITMAP memBM = CreateCompatibleBitmap(hDC, Width, Height);
HBITMAP OldBM = (HBITMAP)::SelectObject(memDC, memBM );
BitBlt(memDC, 0, 0, Width, Height , hDC, BEGINX, BEGINY, SRCCOPY);
int Bpp = GetDeviceCaps(hDC,BITSPIXEL);
int size = Bpp/8 * ( Width * Height );
BYTE *lpBits = new BYTE[size];
GetBitmapBits(memBM, size, lpBits);

但这并没有捕获子窗口的 OpenGL 部分,而是在应该进行 OGL 渲染的区域绘制空白。

【问题讨论】:

    标签: winapi opengl screenshot


    【解决方案1】:

    我记得几年前我在尝试截屏视频时遇到过类似的问题,只是在视频所在的地方出现了一个黑色区域。当时通过减少视频驱动程序上的硬件加速设置来解决这个问题(在 XP 上:右键单击桌面 > 属性 > 设置 > 高级 > 故障排除)。

    关于基于代码的解决方案,您可能需要参考以下之前的帖子:

    Blank Screenshots In Vista and Win7 when gaming

    Saving a screenshot of a window using C#, WPF, and DWM

    【讨论】:

    • 如果源窗口是子窗口,显然你不能用 DWM 缩略图做到这一点。我很沮丧。
    【解决方案2】:

    可能是 NQR,但您可以将场景渲染为位图并将其 BLT 到空白空间中。

    【讨论】:

    • 我不知道,但我无法控制子应用程序,所以我无法尝试。您应该能够渲染到位图,我认为这没有任何问题。但正如我所说,OGL 窗口只是一些应用程序。
    【解决方案3】:

    OpenGL 可能正在渲染到分层上下文中;试试

    BitBlt(memDC, 0, 0, Width, Height , hDC, BEGINX, BEGINY, SRCCOPY | CAPTUREBLT);
    

    改为。

    【讨论】:

      【解决方案4】:

      我假设你在 win 平台上。

      即使您没有子窗口的源代码,您也可以渲染位图。

      1. 首先获取子窗口的正确句柄
        • 正确的句柄搜索非常棘手,因为 win 中几乎所有内容都是一个窗口(所以有数百个句柄...)
      2. 创建位图
      3. 将截屏窗口的渲染/设备上下文句柄更改为您的位图。
        • 并非所有窗口都能做到这一点!!!
      4. 强制重绘
        • 最小化/恢复胜利之类的
      5. 存储您的新位图
      6. 恢复截屏窗口的渲染/设备上下文。

      请注意,这不是一个非常稳定的过程(OpenGL 可能会在上下文句柄更改期间产生冲突),在某些情况下您甚至无法将句柄更改为上下文

      更安全的是自己截图桌面。

      TCanvas *scr=new TCanvas();
      scr->Handle=GetDC(GetDesktopWindow());
      // copy scr to your bitmap (do not forget to resize bitmap)
      

      警告不要太频繁地获取/创建/释放上下文或赢得句柄,因为它有点错误(有时 winapi 函数停止返回正确的处理程序值)更好的方法是获取一次句柄并希望没有人为您关闭窗口...孩子会赢得你确切知道何时获取新处理程序)对于 IsWindow() 函数也是如此。

      欲了解更多信息,请查看:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多