解决 PrintWindow 为空白的原因

Troubleshoot why PrintWindow is blank

我正在尝试使用 PrintWindow 捕获非活动 window 的屏幕截图。它适用于计算器和捕获 Google Chrome,但对于某些其他应用程序,如游戏,它可以节省空白区域。

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

编辑:我想要工具报告为什么 window 无法被捕获

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

The application that owns the window referenced by hWnd processes the PrintWindow call and renders the image in the device context that is referenced by hdcBlt. The application receives a WM_PRINT message or, if the PW_PRINTCLIENT flag is specified, a WM_PRINTCLIENT message. For more information, see WM_PRINT and WM_PRINTCLIENT.

PrintWindow returns window 的内容是否受制于处理 WM_PRINTWM_PRINTCLIENT 的 window 过程message[1] 适当。如果 window 不处理这些消息中的任何一个,它不会将任何内容呈现到提供的设备上下文中。


[1]标准 window 实现为 WM_PRINT/WM_PRINTCLIENT 到 [=15] 提供消息处理程序=].自定义 window class 实现需要提供自己的实现。

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

但这仅适用于实际使用 WM_PAINT 呈现其内容的 windows。当它不存在时,筹码就会下降,大多数游戏实际上都使用 DirectX 进行渲染,并且速度很高,而不依赖于 WM_PAINT 消息。使用具有 alpha 透明度的分层 window 的程序也不会,您通常可以从花哨的混合边框中识别它们。

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

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