我可以在 windows 没有显示器的 运行 机器上截图吗?

Can I take a screenshot on a windows machine that is running without a monitor?

我有一组远程虚拟机 (运行ning windows)。因此,none 这些机器连接了显示器,它们只能通过远程桌面访问。

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

有什么方法可以强制桌面渲染以实现我的屏幕抓取?

编辑: 好吧,更具体地说,这里有一些 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 failed

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

我需要一个解决方案,允许我在没有通过远程桌面连接的情况下获取屏幕截图。

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

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

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

P.S。 Pillow or pyscreenshot怎么样?