我正在尝试使用PrintWindow捕获非活动窗口的屏幕截图。它适用于计算器和捕获谷歌浏览器,但对于其他一些应用程序,如游戏,它可以节省白色区域。
PrintWindow失败的原因是什么,以及如何验证它们?
编辑:我希望工具报告无法捕获窗口的原因答案 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_PRINT
或WM_PRINTCLIENT
消息 [1] 的窗口过程。如果窗口不处理这些消息中的任何一个,则它不会将任何内容呈现在提供的设备上下文中。
WM_PRINT
/ WM_PRINTCLIENT
到DefWindowProc
提供了一个消息处理程序。自定义窗口类实现需要提供自己的。