Снимок экрана с проблемами C # и удаленного рабочего стола - PullRequest
14 голосов
/ 11 апреля 2011

У меня есть консольное приложение C sharp, которое несколько раз делает снимок экрана документа MS Word. Это прекрасно работает, но когда я размещаю это приложение на удаленной машине с Windows XP, оно прекрасно работает, пока я удален, т.е. мой удаленный рабочий стол виден, но если я запускаю свое приложение и покидаю удаленный рабочий стол (сворачивайте его, даже не log с которого я хочу сделать ) скриншоты, которые он делает, пустые!

Приложение «Снимок экрана» запускается службой, которая работает как пользователь SYSTEM.

Как сохранить графический интерфейс для окон, даже если нет подключенных пользователей?

Вот код, который я использую:

public Image CaptureWindow(IntPtr handle)
{
    // get te hDC of the target window
    IntPtr hdcSrc = User32.GetWindowDC(handle);
    // get the size
    User32.RECT windowRect = new User32.RECT();
    User32.GetWindowRect(handle, ref windowRect);
    int width = windowRect.right - windowRect.left;
    int height = windowRect.bottom - windowRect.top;
    // create a device context we can copy to
    IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
    // create a bitmap we can copy it to,
    // using GetDeviceCaps to get the width/height
    IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
    // select the bitmap object
    IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
    // bitblt over
    GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
    // restore selection
    GDI32.SelectObject(hdcDest, hOld);
    // clean up 
    GDI32.DeleteDC(hdcDest);
    User32.ReleaseDC(handle, hdcSrc);

    // get a .NET image object for it
    Image img = Image.FromHbitmap(hBitmap);
    // free up the Bitmap object
    GDI32.DeleteObject(hBitmap);

    return img;
}

Обновление

В настоящее время я использую PrintWindow, единственное, что наиболее близко подошло, когда ему удается захватить оконную раму (т.е. кнопки свертывания, максимизации и закрытия), но внутренняя часть черная.

Несмотря на то, что он не работал полностью, он доказал мне, что можно создать изображение из дескриптора окна, в то время как приложение даже невидимо для пользователя.

1 Ответ

5 голосов
/ 11 апреля 2011

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

Несколько дней назад я наткнулся на это, но у меня не было возможности попробовать это. Если вы попытаетесь, и это работает, пожалуйста, дайте мне знать:)

Взаимодействие с удаленным рабочим столом при минимальном RDC

По поводу ваших комментариев: я думаю, что это еще одна проблема ... Я понимаю, что ваше приложение должно работать, даже если никто не вошел в систему. Я реализовал сервисы, которые могут взаимодействовать с рабочим столом, например, для запуска приложения и его автоматизации. Даже если никто не вошел в систему, вы все равно можете управлять пользовательским интерфейсом, например, с помощью библиотеки автоматизации пользовательского интерфейса (или вашего кода, я полагаю).

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

Я не знаю, что произойдет, если первый вход в систему будет выполнен через RDC. Возможно, вы могли бы попытаться изменить эти настройки RDC, поскольку это влияет на поведение вашего приложения. Другой вариант:

  1. Отключить RDC и настроить Windows на Autologin с указанной учетной записью
  2. Подключитесь к этому аппарату с помощью другого приложения для удаленного рабочего стола (например, TightVNC)

Помогает ли это?

...