制作屏幕截图时有时会发生GDI +错误

时间:2019-06-07 11:55:42

标签: c# .net winforms gdi+

我们有一些代码可以在错误报告期间进行屏幕截图。该应用程序是.NET 4框架中的WinForms,可在Windows Terminal Server上运行。该应用程序通过rdp连接同时使用。该代码相当老,有时会出现以下错误:

  

ExternalException:GDI +中发生了一般错误。

     

堆栈:WinBase.PrikazIznimke.NapraviScreenShot()   WinBase.PrikazIznimke.button1_Click(对象发送方,EventArgs e)

     

内部异常堆栈:System.Drawing.Image.Save(String filename,   ImageCodecInfo编码器,EncoderParameters编码器(Params)   WinBase.PrikazIznimke.NapraviScreenShot()堆栈:   WinBase.PrikazIznimke.NapraviScreenShot()   WinBase.PrikazIznimke.button1_Click(对象发送方,EventArgs e)

     

内部异常堆栈:System.Drawing.Image.Save(String filename,   ImageCodecInfo编码器,EncoderParameters编码器(Params)   WinBase.PrikazIznimke.NapraviScreenShot()。

我们从未理解此错误的原因,我们进行了数次调查,但均未得出结论。该错误本身很少遇到(可能占报告总数的1%)。完整的代码是这样的:

private void NapraviScreenShot()
{
    try
    {
        Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);

        Graphics graphics = Graphics.FromImage(bitmap);
        graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size);

        this.ObrisiScreenShot(); 

        bitmap.Save(Application.UserAppDataPath + @"greska.jpeg", ImageFormat.Jpeg);
    }
    catch (Exception ex)
    {
        bool rethrow = ExceptionPolicy.HandleException(ex, "Logiraj i proslijedi");
        if (rethrow)
            throw;
    }
}

private void ObrisiScreenShot()
{
    try
    {
        string put = Application.UserAppDataPath;
        if (System.IO.File.Exists(put + @"greska.jpeg") == true)
            System.IO.File.Delete(put + @"greska.jpeg");
    }
    catch (System.IO.IOException) 
    {
        return;
    }
    catch (Exception ex)
    {
        bool rethrow = ExceptionPolicy.HandleException(ex, "Logiraj i proslijedi");
        if (rethrow)
            throw;
    }
}

如果您有任何想法,我们下一步可以做什么或任何理论为什么会发生错误,我将不胜感激。

0 个答案:

没有答案