System.ArgumentException:System.Drawing.Graphics.GetHdc()

System.ArgumentException System.Drawing.Graphics.GetHdc()

提问人:trading_dog 提问时间:10/27/2023 最后编辑:trading_dog 更新时间:10/27/2023 访问量:41

问:

我是一个低技能的业余程序员,我编写了一个程序,其功能可以在屏幕上获取像素的颜色。以下方法不是我自己写的。我的程序运行了大约 20 分钟,没有任何问题,并使用该功能来获取像素的颜色(数百或数千次调用)。但是在大约 20 分钟后,我的程序崩溃并出现以下错误(对不起,德语/完整错误见下文):

Anwendung: MyApp.exe
Frameworkversion: v4.0.30319
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.

Ausnahmeinformationen: System.ArgumentException
   bei System.Drawing.Graphics.GetHdc()
   bei MyApp.ColorChecker.GetColorAtCheckPoint(Int32, Int32)
   bei MyApp.MyAppMain+<Run>d__4.MoveNext()
   ....

我的代码:

Color colorAtCheckpoint = ColorChecker.GetColorAtCheckPoint(pos.X,pos.Y);

此代码是复制/粘贴的:(但大多数时候都像魅力一样工作)

public static Color GetColorAtCheckPoint(int checkpointX, int checkpointY)
       {
           screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
           using (Graphics gdest = Graphics.FromImage(screenPixel))
           {
               using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero))
               {
                   IntPtr hSrcDC = gsrc.GetHdc();
                   IntPtr hDC = gdest.GetHdc();
                   int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, checkpointX, checkpointY, (int)CopyPixelOperation.SourceCopy);
                   gdest.ReleaseHdc();
                   gsrc.ReleaseHdc();
               }
           }
           //MessageBox.Show(new Form() { TopMost = true }, $"Color Found: " + screenPixel.GetPixel(0, 0));
           return screenPixel.GetPixel(0, 0);
       }

复制的代码是否有问题,或者system.drawing中是否存在可能的错误?

感谢您的帮助!

错误01:

Anwendung: MyApp.exe
Frameworkversion: v4.0.30319
Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet.
Ausnahmeinformationen: System.ArgumentException
   bei System.Drawing.Graphics.GetHdc()
   bei MyApp.ColorChecker.GetColorAtCheckPoint(Int32, Int32)
   bei MyApp.MyAppMain+<Run>d__4.MoveNext()
   bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task)
   bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)
   bei System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   bei MyApp.MainWindow+<Start>d__15.MoveNext()
   bei System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0(System.Object)
   bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   bei System.Windows.Threading.DispatcherOperation.InvokeImpl()
   bei System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
   bei MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(System.Object)
   bei System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   bei System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   bei System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   bei MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext, System.Threading.ContextCallback, System.Object)
   bei System.Windows.Threading.DispatcherOperation.Invoke()
   bei System.Windows.Threading.Dispatcher.ProcessQueue()
   bei System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   bei MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   bei System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   bei MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
   bei System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
   bei System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
   bei System.Windows.Application.RunDispatcher(System.Object)
   bei System.Windows.Application.RunInternal(System.Windows.Window)
   bei System.Windows.Application.Run(System.Windows.Window)
   bei System.Windows.Application.Run()
   bei MyApp.App.Main()

错误02:

Name der fehlerhaften Anwendung: MyApp.exe, Version: 1.0.0.0, Zeitstempel: 0x84c44dec
Name des fehlerhaften Moduls: KERNELBASE.dll, Version: 10.0.19041.3570, Zeitstempel: 0xfaa05682
Ausnahmecode: 0xe0434352
Fehleroffset: 0x0013d982
ID des fehlerhaften Prozesses: 0x4fc
Startzeit der fehlerhaften Anwendung: 0x01da07e229d3bede
Pfad der fehlerhaften Anwendung: C:\Program Files\MyApp\MyApp.exe
Pfad des fehlerhaften Moduls: C:\Windows\System32\KERNELBASE.dll
Berichtskennung: 099f4e2d-fce9-4d2f-8678-5a54bdffa50c
Vollständiger Name des fehlerhaften Pakets: 
C# 异常 System.Drawing

评论

0赞 500 - Internal Server Error 10/27/2023
可能是资源问题(在 GC 运行之前用完)。试着也放一个。screenPixelusing
1赞 Hans Passant 10/27/2023
这是资源泄漏,图形对象太多。代码忘记释放 Bitmap 对象。
0赞 trading_dog 10/27/2023
谢谢,我做了第一个简短的测试,看起来不错!👍接下来的几天我会做一些测试......

答: 暂无答案