C#方法CopyfFromScreen在200次使用后崩溃了吗?

时间:2013-05-04 14:12:48

标签: c# .net gdi+ screenshot

对于我的程序,我需要一种每隔半分钟截屏一次的方法。我用Google搜索并提出了这种方法:

    public static Bitmap CaptureScreen()
    {
        Bitmap BMP = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height,
        System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        Graphics GFX = Graphics.FromImage(BMP);
        GFX.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Seen.PrimaryScreen.Bounds.Y, 0, 0,  Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
        return BMP;
    }

对于方法的前200次使用,一切正常。然后该函数在CopyFromScreen崩溃并且它说它导致了无效的参数异常。我有点困惑,为什么这是因为参数不会改变。

可能是函数本身只有一个错误吗?如果是这样,有截屏的替代方案吗?

1 个答案:

答案 0 :(得分:1)

可能有两个单独的失败处置。 GraphicsImage / Bitmap都实现了IDisposable,因此两者中的“显而易见”就在这里:

using(Graphics GFX = Graphics.FromImage(BMP)) {
    GFX.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,Seen.PrimaryScreen.Bounds.Y,
        0, 0,  Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
}
return BMP;

但是:你的方法的调用者应 using CaptureScreen的结果(释放位图的GDI +句柄),即

using(var screen = CaptureScreen()) {
    // some work here
}