Я разработал графический интерфейс GUI, который интегрирует тестирование нашего веб-сайта на регулярной основе. Когда что-то терпит неудачу, это займет скриншот рабочего стола, между прочим. Это выполняется автоматически при включенном пользователе на выделенном 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);
}
}
Я убедился, что для заставки установлено значение "Нет" без тайм-аута. Я также реализовал фрагмент кода, который делает пару pinvokes для отправки перемещения мыши, надеясь, что он создаст десктопную графику. Но нет.
IntPtr hWnd = GetForegroundWindow();
if (hWnd != IntPtr.Zero)
SendMessage(hWnd, 0x200, IntPtr.Zero, IntPtr.Zero);
Любые советы приветствуются.