Winapi 为什么PrintWindow是空的疑难解答

Winapi 为什么PrintWindow是空的疑难解答,winapi,screenshot,Winapi,Screenshot,我正在尝试用PrintWindow捕获非活动窗口的屏幕截图。它适用于计算器和谷歌浏览器,但对于其他一些应用程序,如游戏,它可以节省白色区域 PrintWindow失败的原因是什么?如何验证 编辑:我希望工具报告无法捕获窗口的原因的文档提供了有关其实现的信息: 拥有hWnd引用的窗口的应用程序处理PrintWindow调用,并在hdcBlt引用的设备上下文中呈现图像。应用程序接收一条消息,如果指定了PW_PRINTCLIENT标志,则接收一条消息。有关更多信息,请参见WM\u PRINT和WM\u

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

PrintWindow失败的原因是什么?如何验证

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

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

拥有hWnd引用的窗口的应用程序处理PrintWindow调用,并在hdcBlt引用的设备上下文中呈现图像。应用程序接收一条消息,如果指定了PW_PRINTCLIENT标志,则接收一条消息。有关更多信息,请参见WM\u PRINTWM\u PRINTCLIENT

PrintWindow
是否返回窗口内容取决于适当处理
WM_PRINT
WM_PRINTCLIENT
消息[1]的窗口过程。如果窗口不处理这些消息中的任何一条,它将不会在提供的设备上下文中呈现任何内容。
[1]标准窗口实现为
WM\u PRINT
/
WM\u PRINTCLIENT
通过
DefWindowProc
提供消息处理程序。自定义窗口类实现需要提供自己的实现。

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

拥有hWnd引用的窗口的应用程序处理PrintWindow调用,并在hdcBlt引用的设备上下文中呈现图像。应用程序接收一条消息,如果指定了PW_PRINTCLIENT标志,则接收一条消息。有关更多信息,请参见WM\u PRINTWM\u PRINTCLIENT

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

[1]标准窗口实现为
WM\u PRINT
/
WM\u PRINTCLIENT
通过
DefWindowProc
提供消息处理程序。自定义窗口类实现需要提供自己的实现。

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

但这只适用于实际使用WM_PAINT渲染内容的窗口。当它没有的时候,芯片就坏了,大多数游戏实际上都是用DirectX渲染的,而且渲染速度很快,不依赖WM_绘制消息。使用具有alpha透明度的分层窗口的程序也不需要,您通常可以从奇特的混合边框中识别它们

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


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

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

但这只适用于实际使用WM_PAINT渲染内容的窗口。当它没有的时候,芯片就坏了,大多数游戏实际上都是用DirectX渲染的,而且渲染速度很快,不依赖WM_绘制消息。使用具有alpha透明度的分层窗口的程序也不需要,您通常可以从奇特的混合边框中识别它们

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


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

@CodeCaster这不是关于全屏,但谢谢你的提示。@CodeCaster你的链接问题是关于如何获取桌面截图的。桌面显示为空白,因为其内容在子窗口中呈现。我试图获取我的应用程序窗口的子项,但EnumChildWindows失败。该应用程序是具有ApolloRuntimeContentWindow类的Adobe Air应用程序。Windows必须支持
PrintWindow
,但并非所有Windows都支持。@CodeMaster这不是全屏,但是谢谢你的提示。你的链接问题是关于如何获得桌面截图的。桌面显示为空白,因为其内容在子窗口中呈现。我尝试获取我的应用程序窗口的子项,但EnumChildWindows失败。该应用程序是具有ApolloRuntimeContentWindow类的Adobe Air应用程序。Windows必须支持
PrintWindow
,但并非所有窗口都支持。不太容易,WM_PRINT在DefWindowProc()中有一个默认实现。它在使用DirectX的程序(如游戏)中工作的几率为零。@Hans:更新了答案,使其更加明显,处理消息不一定等于编写自己的实现。没那么容易,WM_PRINT在DefWindowProc()中有一个默认实现。它在程序中起作用的几率