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