2015-05-10 78 views
1

這是我的代碼只是截屏整個屏幕。 它工作了幾次後,拋出異常。爲什麼即時獲取Win32Exception:操作成功完成?

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: 

不知道爲什麼異常發生。 它工作正常,但只有很短的時間。

回答

4

BitMapGraphics都實現了IDisposible接口。

你不會在方法結束時處理你的對象。使用構造提供了一個簡單的方法來做到這一點。

更換你的最後四行:

 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); 
     } 

的使用結構保證了系統資源的使用這些類都是免費的,所以你就不會遇到的路線衝突。

2

該消息來自NativeErrorCode == 0,這確實沒有任何錯誤。

要查看實際的故障,您必須查看HResult字段,它是0x80004005。不幸的是,這是一個非常普遍的失敗。

此非零HResult和零NativeErrorCode的組合指示COM組件中的失敗,它直接返回HRESULT而不使用SetLastError()。

你唯一的線索就是發生異常的地方。在圖形處理的情況下,它肯定是一個GDI +調用失敗,因爲GDI +是基於COM的,而GDI不是。

相關問題