如果笔记本电脑屏幕关闭,通过printwindow获取屏幕截图不会重绘

Nul*_*tie 6 python winapi screenshot window screen

我的目标是在笔记本电脑屏幕关闭时从应用程序中截取屏幕截图,但屏幕截图将始终与关闭屏幕前相同.一旦屏幕关闭,它不会重绘,并保持冻结状态.

我正在使用Python中的printwindow获取截图(使用此处描述的方法:Python非活动窗口的截图PrintWindow + win32gui

只要我打开笔记本电脑屏幕,此方法就可以很好地工作,但是如果我将其关闭,它只会在屏幕关闭之前返回最后一个图像.我已经尝试过使用win32gui.RedrawWindow,希望这会强制重绘,但我还没有让它工作,甚至尝试所有不同的标志.我也试过通过pyautogui获取截图,但这也有同样的问题.在笔记本电脑屏幕关闭时有没有办法重绘应用程序?

Cra*_*ied 6

如果有一种直接的方式来做你想做的事情会很好,但不幸的是,如果没有一些复杂的低级别工作,这是不可能的.

在底层的WinAPI中,本机窗口仅在接收WM_PAINT消息时重绘自身,并且只有在可见时才接收WM_PAINT消息.如果它们位于另一个窗口后面,或者它们被拖出屏幕或被最小化,或者它们的可见性设置为False,则它们不会收到消息.屏幕关闭时,它们也不可见.由于它们不可见,它们根本就不会被告知重绘自己.这就是屏​​幕关闭后屏幕捕获图像不会改变的原因.

没有可以发出的命令会覆盖它 - 它是作为窗口范例的基本部分实现的.

一种解决方案是让应用程序将自己绘制在不是窗口(例如,对话框)的内容中并捕获而不是捕获屏幕.您还可以通过重写OnPaint并使用计时器来定期调用OnPaint函数来修改应用程序(因为不会收到WM_PAINT消息).

如果是我,我会覆盖OnPaint,让我的应用程序将自己绘制到背景上下文位图而不是普通窗口,然后使用计时器使周期无效和重绘,只要我想捕获背景上下文的位图输出.

如果您不拥有正在运行的应用程序的代码,您仍然可以通过运行虚拟机中的所有内容来让应用程序重绘自己.我过去已经成功地完成了无头计算,但是之前的版本很多,现在可能会有所不同,所以YMMV ......

有关VMWare下手动屏幕截图的信息,请点击此处.

Hyper-V下的程序化屏幕截图信息就在这里.