Захват экрана в сеансе рабочего стола сервера

Я разработал среду тестирования графического интерфейса пользователя, которая выполняет интеграционное тестирование веб-сайта нашей компании по расписанию. Когда что-то выходит из строя, среди прочего будет сделан снимок экрана с рабочим столом. Это выполняется автоматически для зарегистрированного пользователя на выделенном Windows Server 2008.

Проблема заключается в том, что я делал снимок экрана на рабочем столе, от которого я отключил сеанс удаленного рабочего стола. Я получаю следующее исключение:

System.ComponentModel.Win32Exception (0x80004005): The handle is invalid     
at System.Drawing.Graphics.CopyFromScreen(Int32 sourceX, Int32 sourceY, Int32 destinationX, Int32 destinationY, Size blockRegionSize, CopyPixelOperation copyPixelOperation)     
at System.Drawing.Graphics.CopyFromScreen(Point upperLeftSource, Point upperLeftDestination, Size blockRegionSize)     
at IntegrationTester.TestCaseRunner.TakeScreenshot(String name) in C:\VS2010\IntegrationTester\IntegrationTester\Config\TestCaseRunner.cs:line 144     
at IntegrationTester.TestCaseRunner.StartTest() in C:\VS2010\IntegrationTester\IntegrationTester\Config\TestCaseRunner.cs:line 96

Метод TakeScreenshot () выглядит следующим образом:

public static void TakeScreenshot(string name)
        {
            var bounds = Screen.GetBounds(Point.Empty);
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
                }
                bitmap.Save("someFileName", ImageFormat.Jpeg);
            }
        }

Я убедился, что для заставки установлено значение «Нет» без тайм-аута. Я также реализовал фрагмент кода, который выполняет несколько пинвоксов, чтобы отправить движение мыши , надеясь, что он сгенерирует дескриптор графики рабочего стола ... но нет.

IntPtr hWnd = GetForegroundWindow();
if (hWnd != IntPtr.Zero)
    SendMessage(hWnd, 0x200, IntPtr.Zero, IntPtr.Zero);

Любые советы приветствуются.

19
задан Silas Hansen 7 April 2011 в 11:26
поделиться