Capturar tela na sessão da área de trabalho do servidor

Eu desenvolvi uma estrutura de teste da GUI que faz testes de integração do site da empresa em uma base programada. Quando algo falhar, será feita uma captura de tela da área de trabalho, entre outras coisas. Isso é executado autônoma em um usuário conectado em um Windows Server 2008 dedicado.

O problema é tirar uma captura de tela em uma área de trabalho da qual desconectei minha sessão da área de trabalho remota. Eu recebo a seguinte exceção:

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

oTirar captura de tela() O método se parece com isso:

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);
            }
        }

Verifiquei se o protetor de tela está definido como "Nenhum" sem tempo limite. Eu também implementei um pedaço de código que faz algumas sugestões paraenvie um movimento do mouse, esperando que isso gerasse um identificador de gráficos para desktop ... mas não.

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

Qualquer conselho é apreciado.

questionAnswers(6)

yourAnswerToTheQuestion