这是我的代码只是截取整个屏幕的截图.在它工作几次之后它就抛出了异常.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
例外是在线:
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
Run Code Online (Sandbox Code Playgroud)
这是异常消息:
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:
Run Code Online (Sandbox Code Playgroud)
不确定异常发生的原因.它工作正常但只是很短的时间.
双方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);
Run Code Online (Sandbox Code Playgroud)
附:
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);
}
Run Code Online (Sandbox Code Playgroud)
using构造确保这些类使用的系统资源是免费的,因此您不会遇到冲突.