【问题标题】:Getting screenshot via printwindow not redrawing if laptop screen off如果笔记本电脑屏幕关闭,则通过 printwindow 获取屏幕截图不会重绘
【发布时间】:2018-08-19 10:41:45
【问题描述】:

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

我正在使用 Python 中的 printwindow 获取屏幕截图(使用此处描述的方法:Python Screenshot of inactive window PrintWindow + win32gui

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

【问题讨论】:

  • 您找到解决方案了吗?我也有同样的问题...
  • 很遗憾我没有。
  • 以上示例截取了 Calculator 的屏幕截图,它是 Windows 10 中的 UWP 应用程序。PrintWindow 无法在屏幕打开或关闭时工作。另一个代码在 "Steam" 上工作,我认为它也不是本机 Win32 应用程序,因此会遇到同样的问题。该代码似乎也有资源泄漏,它只是在一段时间后停止工作。我不确定问题是否一定是屏幕关闭。在屏幕关闭时按键盘上的“Print Screen”键,然后使用 “Paint” 查看剪贴板内容,看看它是否打印了屏幕。和睡眠模式不一样?
  • 我认为这与资源泄漏无关,因为它在关闭屏幕后立即发生。您可以使用SendMessage(win32con.HWND_BROADCAST, win32con.WM_SYSCOMMAND, SC_MONITORPOWER, 2) 轻松重现它,其中SC_MONITORPOWER = 0xF170
  • 我无法在我的桌面上重现它。也许笔记本电脑或某些显卡有什么特别之处。

标签: python winapi window screen screenshot


【解决方案1】:

如果有一种简单的方法来做你想做的事,那就太好了,但不幸的是,如果没有一些复杂的低级工作,这是不可能的。

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

没有任何命令可以覆盖它——它是作为窗口范例的基本部分实现的。

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

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

如果您不拥有正在运行的应用程序的代码,您仍然可以通过在虚拟机中运行所有内容来让应用程序重新绘制自己。过去我已经成功地为无头计算做到了这一点,但这是许多操作系统版本之前的事情,现在情况可能有所不同,所以 YMMV...

VMWare下手动截图的信息是here

Hyper-V 下编程截图的信息是here

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 2014-07-08
    • 1970-01-01
    • 2016-09-25
    • 2020-02-05
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多