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后处理它们。我现在唯一好奇的是为什么垃圾收集器以前没有删除这些对象。