У меня есть консольное приложение 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, который является самым близким, поскольку ему удается захватить оконный фрейм (например, кнопки минимизации, максимизации и закрытия), но внутренняя часть черная.
Несмотря на то, что он не полностью работал, он доказал мне, что можно создать изображение из дескриптора окна, пока приложение даже не видно пользователю.