当终端会话最小化或断开连接后,在捕获桌面快照时返回空白屏幕

17

我正在使用以下JAVA代码来捕获远程机器的桌面

    Robot robot = new Robot();
    BufferedImage screenShot = robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));

    ByteArrayOutputStream imageBytes = new ByteArrayOutputStream();
    ImageIO.write(screenShot, "PNG", imageBytes);

    return imageBytes.toByteArray();

但是,当远程机器的终端会话处于最小化或断开连接状态时,捕获的图像为空白。我感谢您在解决该问题上给予的帮助,至少针对最小化的情况。

配置:我在运行Windows 7的物理机和运行Windows Server 2008 R2的虚拟机上都遇到了同样的问题。

来自MSDN的更多见解:

为什么断开RDP连接后屏幕变黑? http://msdn.microsoft.com/en-us/library/aa383015%28VS.85%29.aspx

以下是我的尝试,但是没有一个成功: 

如何在RDP窗口最小化时获取数据? 您可以强制RDP显示驱动程序在最小化时发送数据,尝试以下步骤并告诉我效果如何:

1)添加以下键值:HKEY_LOCAL_MACHINE\Software\Microsoft\Terminal Server Client\ 创建一个新的DWORD值并将其命名为RemoteDesktop_SuppressWhenMinimized。将2指定为值数据。

注意:还尝试将注册表键添加到HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Terminal Server Client\

2)禁用位图缓存(http://technet.microsoft.com/en-us/library/cc737325(WS.10).aspx) 在远程桌面连接窗口中,单击“选项”。 在“体验”选项卡上,验证选择了“位图缓存”复选框。或者,要禁用位图缓存,则清除“位图缓存”复选框。


我看到你把这个问题标记为selenium。你是在远程会话中运行selenium测试吗?如果是,为什么不在远程会话中作为你的selenium脚本的一部分进行屏幕截图呢? - Tom E
5个回答

8
如果你最小化了远程桌面窗口,Windows 会将远程会话切换到无GUI模式,并且不会显示窗口和控件。因此,TestComplete(或TestExecute)将无法与被测试应用程序的GUI进行交互,因为它不存在,你的自动化GUI测试将失败。
为了解决这个问题,你可以在启动远程桌面的本地计算机上更改远程桌面的注册表设置:
在本地计算机上关闭所有打开的远程桌面会话。 启动注册表编辑器(regedit.exe)。 导航到以下其中一个注册表键值,具体取决于是否仅希望修改当前用户的远程桌面设置或修改计算机上所有用户的设置:
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client HKEY_LOCAL_MACHINE\Software\Microsoft\Terminal Server Client
创建一个名为RemoteDesktop_SuppressWhenMinimized的DWORD值,并将其设置为2。
或者你可以按照以下步骤以编程方式执行:
1. 使窗口透明 2. 恢复窗口 3. 捕获 4. 再次最小化 5. 取消透明度

你们是从哪里找到这些隐藏的DWORDs的?也许这应该成为一个单独的问题?这是一个重要的设置,为什么要隐藏它? - Jon Grah

1
去年我们项目中遇到了类似的问题...我们无法找到稳定和永久的解决方案...然而这是我们采用的一个解决方法...
我们不得不在5台远程桌面上运行(同时在故障期间进行屏幕截图)...然而,正如您已经发现的,如果我们断开会话或最小化RDC窗口,将会捕获空白屏幕截图。因此,我们又添加了一台虚拟机来连接那其他五个测试盒子。该VM的任务是保持会话活跃并调整大小以适应其他5个框...这对我们起作用。

0

如果您连接到测试机器的远程桌面,请确保在完成后重新启动机器,否则桌面将保持锁定状态,屏幕截图将无法工作。

我认为没有其他解决办法。


0

我刚刚配置了客户端自动登录,禁用了屏幕保护,并在每个客户端上安装了VNC服务器。

基本上,确保屏幕始终开着,不要使用远程桌面连接。

这在物理PC和运行在Hyper-V服务器上的虚拟机上都可以工作。

我甚至编写了一个小的.NET桌面客户端,在单个窗口中运行多个VNC客户端,以便我们可以看到所有客户端上发生的情况。我们有一台旧PC运行着这个客户端,它的显示器放在橱柜顶部,让开发人员看到是否有任何客户端挂起,是否打开了数百个浏览器窗口等等,并且对于路过的非开发人员来说也很酷炫。


0
一个比上面的答案更简单的替代方案是将终端会话(RDP)转化为控制台会话。会话将显示在物理屏幕上(将当前已登录到物理计算机的用户切换)。以下命令可实现此操作:
for /f "skip=1 tokens=3" %%s in ('query user %USERNAME%') do (tscon.exe %%s /dest:console)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接