Я разработал среду тестирования графического интерфейса пользователя, которая выполняет интеграционное тестирование веб-сайта нашей компании по расписанию. Когда что-то выходит из строя, среди прочего будет сделан снимок экрана с рабочим столом. Это выполняется автоматически для зарегистрированного пользователя на выделенном 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);
Любые советы приветствуются.