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

Windows 7 最小化\断开连接时的终端会话在捕获桌面快照时返回空白屏幕,windows-7,selenium,remote-desktop,rdp,terminal-services,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(); Imag

我正在使用下面的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的连接时会出现黑屏?  

以下是我试图让事情顺利进行的尝试,但以下任何一项都没有奏效:

当RDP窗口最小化时如何获取数据?   您可以强制RDP显示驱动程序在缩小时发送数据,请尝试以下步骤,并让我知道如何进行:   1) 添加以下键 HKEY\U LOCAL\U MACHINE\Software\Microsoft\Terminal Server Client\创建了一个新的DWORD值,并将其命名为RemoteDesktop\U SuppressWhenMinimized。指定2作为值数据

注意:还尝试将注册表项添加到HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Terminal Server Client\   2) 禁用位图缓存() 在远程桌面连接窗口中,单击选项


在“体验”选项卡上,验证是否选中“位图缓存”复选框。或者,要禁用位图缓存,请清除位图缓存复选框。如果将远程桌面连接到测试计算机,请确保在完成连接后重新启动计算机,否则桌面将保持锁定,屏幕捕获将无法工作


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

去年我们的项目中也遇到了类似的问题……我们可以找到任何稳定和永久的解决方案……不过,下面是一个解决方法对我们的作用


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

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

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

这在物理PC和托管在Hyper-V服务器上的虚拟机上都有效


我甚至编写了一个小型的.NET桌面客户端,在一个窗口中运行多个VNC客户端,这样我们就可以看到所有客户端上发生了什么。我们有一台旧电脑运行它,它的显示器放在柜子上,(a)让开发人员查看是否有客户端挂起,打开了数百个浏览器窗口,等等,(b)让经过的任何非开发人员都印象深刻。

如果你最小化远程桌面窗口,Windows将远程会话切换到无GUI模式,并且不显示窗口和控件。因此,TestComplete(或TestExecute)将无法与测试应用程序的GUI交互,因为它不存在,并且您的自动GUI测试将失败。 要解决此问题,您可以在本地计算机(启动远程桌面的位置)上更改远程桌面的注册表设置: 在本地计算机上,关闭所有打开的远程桌面会话。 启动注册表编辑器(regedit.exe)。 导航到以下注册表项之一,具体取决于您是要仅修改当前用户的远程桌面设置,还是要修改计算机上所有用户的远程桌面设置:

HKEY\ U当前\用户\软件\微软\终端服务器客户端 HKEY\ U本地\计算机\软件\微软\终端服务器客户端 在最小化时创建名为RemoteDesktop_suppress的DWORD值,并将其设置为2

或者,您可以通过以下步骤以编程方式执行此操作:

  • 透明的窗户
  • 恢复窗口
  • 俘获
  • 再次最小化它
  • 去除透明度

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

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

      我看到你将这个问题标记为selenium。您是否在远程会话中运行selenium测试?如果是这样,为什么不在远程会话中进行屏幕捕获,作为selenium脚本的一部分呢?你们从哪里找到这些隐藏的DWORD???也许这本身就是个问题?这是一个重要的背景;为什么要把它藏起来?