Сеанс терминала при свёртывании \ отключении возвращает пустой экран при захвате снимка рабочего стола
Я использую приведенный ниже код 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 ответов
Если свернуть окно удаленного рабочего стола, Windows переключает удаленный сеанс в режим без графического интерфейса и не отображает окна и элементы управления. В результате TestComplete (или TestExecute) не сможет взаимодействовать с GUI тестируемого приложения, так как он не существует и ваш автоматический тест GUI не будет выполнен. Чтобы обойти эту проблему, вы можете изменить параметры реестра удаленного рабочего стола на локальном компьютере (где вы запускаете удаленный рабочий стол). На локальном компьютере закройте все открытые сеансы удаленного рабочего стола. Запустите редактор реестра (regedit.exe). Перейдите к одному из следующих разделов реестра, в зависимости от того, хотите ли вы изменить параметры удаленного рабочего стола только для текущего пользователя или для всех пользователей на компьютере:
HKEY_CURRENT_USER \ Software \ Microsoft \ Клиент сервера терминалов HKEY_LOCAL_MACHINE\Software\Microsoft\ Клиент сервера терминалов Создайте значение DWORD с именем RemoteDesktop_SuppressWhenMinimized и установите для него значение 2.
Или вы можете сделать это программно, выполнив следующие действия:
- Прозрачное окно
- Восстановить окно
- Захватить
- Сверните это снова
- Удалить прозрачность
У нас была похожая проблема в нашем проекте в прошлом году... мы могли найти любое стабильное и постоянное решение... однако вот как обходной путь работал для нас...
Мы должны были работать на 5 удаленных рабочих столах (которые также будут снимать экраны во время сбоя) ... однако, как вы уже поняли, если мы отключаем сеанс или минимизируем снимок экрана, пустое окно RDC Window захватывается. Поэтому мы добавили еще одну виртуальную машину для подключения этих пяти других тестовых блоков. Задача для этой виртуальной машины состоит в том, чтобы поддерживать сессию активной и изменять ее размер на другие 5 блоков... это работало для нас.
Если вы подключаете удаленный рабочий стол к тестовому компьютеру, обязательно перезагрузите компьютер, когда закончите, иначе рабочий стол останется заблокированным, и снимки экрана не будут работать.
Я не верю, что есть какой-то другой способ обойти эту проблему.
Более простая альтернатива вышеприведенным ответам - преобразовать сеанс терминала (RDP) в сеанс консоли. Затем сеанс отобразится на физическом экране (переключение пользователя, который в данный момент вошел на физическую машину). Следующая команда делает это:
for /f "skip=1 tokens=3" %%s in ('query user %USERNAME%') do (tscon.exe %%s /dest:console)
Я просто настроил клиенты на автоматический вход, отключил заставку и установил сервер VNC на каждом клиенте.
В основном, убедитесь, что экран всегда включен, и не включайте RDP в них.
Это работало как на физических ПК, так и на виртуальных машинах, размещенных на сервере Hyper-V.
Я даже написал небольшой клиент для настольных компьютеров.NET, который запускал несколько клиентов VNC в одном окне, чтобы мы могли видеть, что происходит на всех клиентах. У нас был старый ПК с установленным на нем монитором сверху шкафа, чтобы (а) позволить разработчикам увидеть, висел ли какой-либо клиент, открыты ли сотни окон браузера и т. Д., И (б) выглядеть впечатляюще для любых не-разработчиков проходя мимо.