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

C#方法CopyfFromScreen在使用200次后崩溃?,c#,.net,gdi+,screenshot,C#,.net,Gdi+,Screenshot,对于我的程序,我需要一种每半分钟截图一次的方法。我在谷歌上搜索并想出了这个方法: public static Bitmap CaptureScreen() { Bitmap BMP = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)

对于我的程序,我需要一种每半分钟截图一次的方法。我在谷歌上搜索并想出了这个方法:

    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
处崩溃,并表示它导致了无效参数异常。我有点困惑为什么会这样,因为参数没有改变


可能是函数本身有一个bug吗?如果是这样的话,是否有其他方法可以截图?

可能需要处理两个单独的故障。
图形
图像
/
位图
都实现了
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;
但是:方法的调用者也应该是
使用
CaptureScreen
的结果(释放位图的GDI+句柄),即


可能有两个单独的故障需要处理。
图形
图像
/
位图
都实现了
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;
但是:方法的调用者也应该是
使用
CaptureScreen
的结果(释放位图的GDI+句柄),即


尝试在CopyFromScreen之后处理GFX创建过多位图导致内存不足。导致有点糟糕的GDI+异常。您将不得不处理它们以防止这种情况发生。@Hans GDI+通常在出现诸如内存不足之类的问题之前很久就会用完句柄,但是,是的,这方面的错误消息令人困惑。IIRC“通用GDI+错误”是一种常见错误one@Marc-屏幕截图通常会更快地消耗内存。以1980 x 1080 x 4 x 200=1.7吉格比为例。但是10000个句柄配额中只有200个句柄。好的,谢谢,我现在可以解决它了。诀窍是在我使用完GFX和BMP后处理它们。我现在唯一好奇的是为什么垃圾收集器以前没有删除这些对象。试着在CopyFromScreen之后处理GFX因为创建了太多位图而导致内存不足。导致有点糟糕的GDI+异常。您将不得不处理它们以防止这种情况发生。@Hans GDI+通常在出现诸如内存不足之类的问题之前很久就会用完句柄,但是,是的,这方面的错误消息令人困惑。IIRC“通用GDI+错误”是一种常见错误one@Marc-屏幕截图通常会更快地消耗内存。以1980 x 1080 x 4 x 200=1.7吉格比为例。但是10000个句柄配额中只有200个句柄。好的,谢谢,我现在可以解决它了。诀窍是在我使用完GFX和BMP后处理它们。我现在唯一好奇的是为什么垃圾收集器以前没有删除这些对象。