解决PrintWindow为空的原因

时间:2015-06-06 11:25:47

标签: winapi screenshot

我正在尝试使用PrintWindow捕获非活动窗口的屏幕截图。它适用于计算器和捕获谷歌浏览器,但对于其他一些应用程序,如游戏,它可以节省白色区域。

PrintWindow失败的原因是什么,以及如何验证它们?

编辑:我希望工具报告无法捕获窗口的原因

2 个答案:

答案 0 :(得分:2)

每个窗口都有一个WM_PRINT的默认实现,如果你调用PrintWindow()并且不使用PW_CLIENTONLY标志,你将使用它。由默认窗口过程DefWindowProc()提供。它很简单,它创建一个内存DC并发送WM_PAINT。因此,您在位图中获得的内容与您在屏幕上获得的内容相同。大家都很开心。

但这仅适用于实际使用WM_PAINT呈现其内容的窗口。当芯片没有时,芯片就会关闭,大多数游戏实际上都是用DirectX渲染的,并且是以高速率渲染的,而不是依赖于WM_PAINT消息。使用具有Alpha透明度的分层窗口的程序也没有,您通常可以从花哨的混合边框识别它们。

这样的程序应该做的是为WM_PRINT / CLIENT编写自己的消息处理程序,并将它们的表面渲染到设备上下文中。这是必要的,因为默认实现并不了解有关DirectX表面的bean。

游戏不是这样做的,他们必须编写的额外代码几乎没有人真正使用过。你不可避免地会得到一个空的位图。当然,你无能为力。

答案 1 :(得分:1)

PrintWindow的文档提供了有关其实施的信息:

  

拥有hWnd引用的窗口的应用程序处理 PrintWindow 调用,并在 hdcBlt 引用的设备上下文中呈现图像。应用程序收到WM_PRINT消息,或者,如果指定了 PW_PRINTCLIENT 标记,则会收到WM_PRINTCLIENT消息。有关详细信息,请参阅 WM_PRINT WM_PRINTCLIENT

PrintWindow是否返回窗口的内容取决于适当处理WM_PRINTWM_PRINTCLIENT消息 [1] 的窗口过程。如果窗口不处理这些消息中的任何一个,则它不会将任何内容呈现在提供的设备上下文中。


[1] 标准窗口实现为WM_PRINT / WM_PRINTCLIENTDefWindowProc提供了一个消息处理程序。自定义窗口类实现需要提供自己的。