Терминальный сеанс при минимизации \disconnected возвращает пустой экран при захвате снимка рабочего стола

Я использую приведенный ниже код 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 2008 R2.

Дополнительные сведения из MSDN:

Почему вы получаете черный экран при отключении от RDP? http://msdn.microsoft.com/en-us/library/aa383015%28VS.85%29.aspx

Вот моя попытка заставить все работать, но ни один из следующих не сделал трюк:

Как получить данные при сверке окна RDP? Вы можете заставить драйвер дисплея RDP отправлять данные при минировании, проделать эти шаги и сообщить мне, как это происходит: 1) Добавьте следующий ключ HKEY_LOCAL_MACHINE\Software\Microsoft\Клиент сервера терминалов\Создал новое значение 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) В окне "Подключение к удаленному рабочему столу" нажмите "Параметры".

На вкладке "Опыт" убедитесь, что установлен флажок "Кэширование растрового изображения". Или, чтобы отключить кеширование растрового изображения, снимите флажок кэширования элемента управления

Ответы

Ответ 1

Если вы минимизируете окно удаленного рабочего стола, Windows переключает удаленный сеанс в режим без графического интерфейса и не отображает окна и элементы управления. В результате TestComplete (или TestExecute) не сможет взаимодействовать с графическим интерфейсом тестируемых приложений, поскольку он не существует, и ваш автоматический тест GUI завершится неудачно. Чтобы обойти эту проблему, вы можете изменить параметры реестра Remote Desktop на локальном компьютере (где вы запускаете удаленный рабочий стол): На локальном компьютере закройте все сеансы удаленного рабочего стола. Запустите редактор реестра (regedit.exe). Перейдите к одному из следующих ключей реестра, в зависимости от того, хотите ли вы изменить параметры удаленного рабочего стола только для текущего пользователя или для всех пользователей на компьютере:

HKEY_CURRENT_USER\Программное обеспечение\Microsoft\Клиент сервера терминалов HKEY_LOCAL_MACHINE\Программное обеспечение\Microsoft\Клиент сервера терминалов Создайте значение DWORD с именем RemoteDesktop_SuppressWhenMinimized и установите его на 2.

Или вы можете сделать это программно, выполнив следующие шаги:

  • Прозрачное окно
  • Восстановить окно
  • Захват
  • Свести к минимуму снова
  • Удалить прозрачность

Ответ 2

Если вы подключаете удаленный рабочий стол к тестовому компьютеру, убедитесь, что вы перезагрузили компьютер, когда вы закончите, в противном случае рабочий стол останется заблокированным, а снимки экрана не будут работать.

Я не верю, что есть другие способы решения проблемы.

Ответ 3

У нас была аналогичная проблема в нашем проекте в прошлом году... мы могли найти стабильное и постоянное решение... однако вот как работа работала для нас...

Нам приходилось запускать на 5 удаленных рабочих столах (что также приведет к захвату экрана во время сбоя). Однако, как вы уже поняли, если отключить сеанс или свести к минимуму окно RDC, будет снят пустой снимок экрана. Поэтому мы добавили еще одну виртуальную машину для подключения этих пяти тестовых ящиков. Задача этой виртуальной машины состоит в том, чтобы сохранить сессию активной и измененной на другие 5 ящиков... это сработало для нас.

Ответ 4

Я только что настроил клиентов на автоматический вход в систему, отключил экранную заставку и установил сервер VNC для каждого клиента.

В принципе, убедитесь, что экран всегда включен, и в них нет RDP.

Это работало как на физических ПК, так и на виртуальных машинах, размещенных на сервере Hyper-V.

Я даже написал небольшой настольный клиент .NET, который запускал несколько клиентов VNC в одном окне, чтобы мы могли видеть, что происходит на всех клиентах. У нас был старый компьютер, на котором он работал с монитором поверх шкафа, чтобы (а) позволить разработчикам увидеть, был ли какой-либо клиент висел, открылись сотни окон браузера и т.д. И (б) выглядеть впечатляюще для любых не-разработчиков мимо.