这是我的代码,只是截取整个屏幕的截图。 在它工作几次之后它就抛出了异常。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace Capture_ScreenShots
{
public partial class Form1 : Form
{
string bfbc;
string save_location;
int save_image;
int screenWidth;
int screenHeight;
public Form1()
{
InitializeComponent();
save_location = @"c:\screenshots\sc1\";
timer1.Enabled = true;
timer1.Interval = 200;
save_image = 0;
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void timer1_Tick(object sender, EventArgs e)
{
save_image = save_image + 1;
bfbc = save_location + save_image.ToString("D3") + ".jpg";
screenWidth = Screen.GetBounds(new Point(0, 0)).Width;
screenHeight = Screen.GetBounds(new Point(0, 0)).Height;
Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight);
Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
bmpScreenShot.Save(bfbc, ImageFormat.Jpeg);
}
}
}
例外是在线:
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
这是异常消息:
System.ComponentModel.Win32Exception was unhandled
HResult=-2147467259
Message=The operation completed successfully
Source=System.Drawing
ErrorCode=-2147467259
NativeErrorCode=0
StackTrace:
at System.Drawing.Graphics.CopyFromScreen(Int32 sourceX, Int32 sourceY, Int32 destinationX, Int32 destinationY, Size blockRegionSize, CopyPixelOperation copyPixelOperation)
at System.Drawing.Graphics.CopyFromScreen(Int32 sourceX, Int32 sourceY, Int32 destinationX, Int32 destinationY, Size blockRegionSize)
at Capture_ScreenShots.Form1.timer1_Tick(Object sender, EventArgs e) in d:\C-Sharp\Capture_ScreenShots\Capture_ScreenShots\Capture_ScreenShots\Form1.cs:line 44
at System.Windows.Forms.Timer.OnTick(EventArgs e)
at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at Capture_ScreenShots.Program.Main() in d:\C-Sharp\Capture_ScreenShots\Capture_ScreenShots\Capture_ScreenShots\Program.cs:line 18
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
不确定异常发生的原因。 它工作正常但只是很短的时间。
答案 0 :(得分:5)
BitMap
和Graphics
都实现了IDisposible接口。
您不会在方法结束时处置您的对象。 using结构提供了一种简单的方法。
替换最后四行:
Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight);
Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
bmpScreenShot.Save(bfbc, ImageFormat.Jpeg);
使用:
using (Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight))
using (Graphics gfx = Graphics.FromImage((Image)bmpScreenShot))
{
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
bmpScreenShot.Save(bfbc, ImageFormat.Jpeg);
}
using构造确保这些类使用的系统资源是免费的,因此您不会遇到冲突。
答案 1 :(得分:3)
消息来自NativeErrorCode == 0
,这确实没有任何错误。
要查看实际失败,您必须查看HResult字段,即0x80004005。不幸的是,这是一个非常普遍的失败。
非零HResult和零NativeErrorCode的组合表示COM组件失败,它直接返回HRESULT而不使用SetLastError()。
你唯一的其他线索是异常发生的地方。在图形处理的这种情况下,它肯定是一个失败的GDI +调用,因为GDI +是基于COM的,而GDI不是。