2010-01-27 244 views
3

我有一个带儿童的主窗口。我需要以编程方式截取屏幕截图,然后在我的主窗口上裁剪并绘制它们。我这样做的方式是:获取运行OpenGL的子窗口的屏幕截图(Windows)

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渲染被认为是该地区。

回答

0

我记得几年前有类似的问题,当时我试图屏幕抓取一个视频,只是得到一个黑色的地区,视频已经。通过减少视频驱动程序上的硬件加速设置(在XP上:右键单击桌面>属性>设置>高级>故障排除),可以解决此问题。

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

Blank Screenshots In Vista and Win7 when gaming

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

+0

显然,如果源窗口是子项目,则无法使用DWM缩略图来实现。我烦了。 – 2010-01-27 18:46:54

0

可能NQR,但你可以渲染场景到一个位图和把它放进空白空间。

+0

我不知道,但我无法控制孩子的应用程序,所以我不能尝试它。你应该能够渲染到一个位图,我没有看到任何问题。但正如我所说的OGL窗口只是一些应用程序。 – 2010-01-27 01:57:08

0

我假设你在赢得平台。

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

  1. 首先获得正确的手柄的子窗口
    • 正确处理搜索是非常棘手的,因为几乎所有的胜利是一个窗口(所以有上百个处理...)
  2. 创建位图
  3. 将截图窗口的渲染/设备上下文更改为您的位图。
    • 并非所有的窗户都可以做到这一点!
  4. 力重绘
    • 最小化/恢复双赢什么
  5. 存储新的位图
  6. 恢复渲染你screenshoted窗口/设备上下文。

当心这不是很稳定的过程(OpenGL的可以让冲突中的上下文句柄变化),并在某些情况下,你甚至不能改变把手到上下文

更安全的是桌面截图它的自我。

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

警告没有获得/创建/释放上下文或胜利往往处理,因为它是一个小马车(有时WINAPI功能停止返回正确的处理程序的值)更好的方式是获得手柄一次,希望没有人关闭窗口。 ..为你的孩子赢得你知道什么时候获得新的处理程序)IsWindow()函数也是如此。

欲了解更多信息看一看:

0

的OpenGL可能会被渲染成一个分层的背景下;尝试

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

改为。