Подтвердить что ты не робот

Захват экрана с проблемами С# и удаленного рабочего стола

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

Приложение Скриншот запускается службой, которая работает как пользователь 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;
}

Update

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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