【发布时间】: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