リモート接続する仮想マシン (実行中の Windows) のバンクがあります。そのため、これらのマシンにはモニターが接続されておらず、リモート デスクトップによってのみアクセスされます。
デスクトップで実行中のアプリケーションのスクリーンショットを取得したいと考えています。私が見つけたのは、リモート デスクトップ経由で接続していない場合、画面がレンダリングされず、画面をキャプチャできないことです (私が管理した最善の方法は、黒い画像を取得することです)。
画面グラブのためにデスクトップを強制的にレンダリングする方法はありますか?
編集:より具体的には、マシンにリモート接続されている場合にスクリーンショットを取得する 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: 明確にするために、コードは VM 自体で実行されています。しかし、誰もマシンにリモート接続されていないときに実行されています。