我的目标是在笔记本电脑屏幕关闭时从应用程序中截取屏幕截图,但屏幕截图将始终与关闭屏幕前相同。一旦屏幕关闭,它就不会重绘,并且仍然会冻结。
我使用Python的printwindow获取截图(使用此处描述的方法:Python Screenshot of inactive window PrintWindow + win32gui
只要我打开笔记本电脑屏幕,此方法就可以正常工作,但如果我将其关闭,它只会在屏幕关闭之前返回最后一张图像。我尝试过使用win32gui.RedrawWindow,希望这会强制重绘,但我还没有让它工作,甚至尝试所有不同的标志。我也试过通过pyautogui获取截图,但这也有同样的问题。有没有办法在笔记本电脑屏幕关闭时重绘应用程序?
答案 0 :(得分:6)
如果有一种直接的方法来完成您想做的事情,那将是很好的选择,但是不幸的是,如果没有一些复杂的低级工作,这是不可能的。
在基础WinAPI中,仅当本机窗口接收到WM_PAINT消息时才重绘自身,并且仅在可见时才接收WM_PAINT消息。如果它们在另一个窗口后面,或者它们被拖动到屏幕之外或最小化,或者其可见性设置为False,则它们不会收到消息。屏幕关闭时,它们也不可见。由于它们不可见,因此根本不会被告知要重绘它们。这就是关闭屏幕后屏幕捕获图像没有改变的原因。
您无法发出将其覆盖的命令-它被实现为开窗范例的基本部分。
一种解决方案是让应用程序在非窗口(例如,对话框)之外的地方绘制自身,然后捕获而不是捕获屏幕。您还可以通过覆盖OnPaint并使用计时器来使应用程序无效并定期调用OnPaint函数来修改应用程序(因为将不会收到WM_PAINT消息)。
如果是我,我将覆盖OnPaint,使我的应用程序将其自身绘制到背景上下文位图而不是普通窗口,然后使用计时器使之无效并定期重绘,并在需要时仅获取背景上下文的位图捕获输出。
如果您不拥有正在运行的应用程序的代码,则仍然可以通过在虚拟机中运行所有内容来使应用程序重新绘制自身。过去,我已经成功地实现了无头计算,但是以前是很多OS版本,现在情况可能有所不同,因此YMMV ...
VMWare下的手动屏幕截图信息为here。
Hyper-V下的程序化屏幕截图信息为here。