2

リモート接続する仮想マシン (実行中の 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 自体で実行されています。しかし、誰もマシンにリモート接続されていないときに実行されています。

4

1 に答える 1

0

明らかな回避策は、2 つの仮想マシンを使用することです。マスター ホストは、ターゲット 1 に対してリモート セッションを実行します。mouse_eventや などの入力アクションも可能keybd_eventです。唯一の要件は、焦点が合っていない可能性がありますが、RDP ウィンドウ (または VNC ソフトウェア、それは問題ではありません) を最小化しないことです。

これは、ビルド/テスト マシン プールに広く使用されている方法です。私は大きなテストチームで数年間働いていましたが、他のアプローチについて聞いたことがありません.

PS Pillowまたはpyscreenshotはどうですか?

于 2015-02-26T15:55:24.493 に答える