【问题标题】:Can I take a screenshot on a windows machine that is running without a monitor?我可以在没有显示器的情况下在 Windows 机器上截屏吗?
【发布时间】:2015-04-19 15:32:27
【问题描述】:

我有一组可以远程访问的虚拟机(运行窗口)。因此,这些机器都没有连接监视器,它们只能由远程桌面访问。

我想获取在桌面上运行的应用程序的屏幕截图。我发现如果我没有通过远程桌面连接,那么屏幕不会呈现并且我无法捕获屏幕(我管理的最好的方法是获得黑色图像)。

有没有什么方法可以强制桌面呈现以用于我的屏幕抓取?

编辑: 好的,更具体地说,这里有一些 Python 代码,如果我被远程连接到机器上,它会截取屏幕截图:

import win32ui
import win32gui
hwnd = win32gui.FindWindow(None, window_name)
wDC = win32gui.GetWindowDC(hwnd)
dcObj = win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, width, height)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0, 0), (width, height), dcObj, (0, 0), win32con.SRCCOPY)
dataBitMap.SaveBitmapFile(cDC, image_name)
# Free Resources
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())

如果我在远程状态下运行它,它工作正常。一旦我没有被远程控制,我就会收到以下错误:

win32ui.error: BitBlt 失败

此错误是由于没有人远程进入时屏幕未呈现。

当我没有通过远程桌面连接时,我需要一个能够让我在这种情况下获取屏幕截图的解决方案。

编辑 2: 需要明确的是,代码是在虚拟机本身上运行的。但是当没有人远程进入机器时它正在运行。

【问题讨论】:

  • 这里的说明可能会有所帮助:superuser.com/questions/62051/…
  • 这太离题了,我对虚拟机的了解也不是很好。但我会说,您可能需要研究远程桌面协议的实现来实现这些目的。
  • 我做了什么让这个问题赢得了如此多的反对票?我想知道以供将来参考...
  • 我投票决定重新开放,因为我知道答案。
  • 目前尚不清楚您是尝试获取在同一桌面上的虚拟机中运行的代码、在同一虚拟机中但在另一个桌面上运行的代码,还是在主机上的虚拟机之外运行的屏幕截图。

标签: python winapi rendering screenshot bitblt


【解决方案1】:

明显的解决方法是使用 2 个虚拟机:主主机为目标主机运行远程会话。它还允许像mouse_eventkeybd_event 这样的输入操作。唯一的要求是不要最小化 RDP 窗口(或 VNC 软件,没关系),尽管它可能会失焦。

它是构建/测试机器池的广泛使用的方法。我在大型测试团队工作了几年,从未听说过其他方法。

附言Pillowpyscreenshot 怎么样?

【讨论】:

  • 这是一个有趣的想法。理想情况下,我希望能够在完全不受远程控制的情况下进行截图。如果我走这条路,我需要能够自动化一个虚拟机与所有其他虚拟机建立远程桌面连接,并确保它保持连接(满足断开连接、重新启动、其他用户远程访问等),这会很棘手。
  • 我已将此标记为正确,因为最终,这几乎就是我们为解决问题所做的工作。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2020-08-23
  • 2018-08-29
  • 1970-01-01
相关资源
最近更新 更多