最小化\断开时的终端会话在捕获桌面快照时返回空白屏幕

时间:2011-03-30 22:25:30

标签: windows-7 selenium remote-desktop rdp terminal-services

我正在使用以下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) 在“远程桌面连接”窗口中,单击“选项”。

在“体验”选项卡上,验证是否已选中“位图缓存”复选框。或者,要禁用位图缓存,请清除“位图缓存”复选框

5 个答案:

答案 0 :(得分:7)

如果最小化远程桌面窗口,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 :(得分:1)

去年我们的项目遇到了类似的问题......我们可以找到任何稳定而永久的解决方案......但是这里的工作方式对我们有用......

我们必须在5个远程桌面上运行(在故障期间也将捕获屏幕)..但是如果我们已经想到如果我们断开会话或最小化RDC窗口空白屏幕截图被捕获。因此,我们添加了一个VM来连接其他五个测试盒。该VM的任务是保持会话活动并调整大小到其他5个框...这对我们有用。

答案 2 :(得分:0)

如果您将远程桌面连接到测试计算机,请确保在完成后重新启动计算机,否则桌面将保持锁定状态并且屏幕捕获将无法正常工作。

我不相信有任何其他方法可以解决这个问题。

答案 3 :(得分:0)

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

基本上,请确保屏幕始终处于开启状态,并且不要将RDP加入其中。

这适用于物理PC和Hyper-V服务器上托管的虚拟机。

我甚至编写了一个小型.NET桌面客户端,它在一个窗口内运行多个VNC客户端,因此我们可以看到所有客户端上发生了什么。我们有一台老式电脑用它的监视器在柜子顶部运行它(a)让开发人员看看是否有任何客户端挂起,打开了数百个浏览器窗口等等。(b)看起来令人印象深刻任何走过的非开发商。

答案 4 :(得分:0)

上述答案的一种更简单的替代方法是将终端会话(RDP)转换为控制台会话。然后,会话将显示在物理屏幕上(切换当前登录到物理计算机的任何人的用户)。以下命令可以执行此操作:

for /f "skip=1 tokens=3" %%s in ('query user %USERNAME%') do (tscon.exe %%s /dest:console)