Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CallbackOnCollectedDelegate位于Application.Run(新Form1())_C#_Exception_Garbage Collection_Directx_Screen Capture - Fatal编程技术网

C# CallbackOnCollectedDelegate位于Application.Run(新Form1())

C# CallbackOnCollectedDelegate位于Application.Run(新Form1()),c#,exception,garbage-collection,directx,screen-capture,C#,Exception,Garbage Collection,Directx,Screen Capture,我制作了一个非常小的应用程序,它使用SlimDX捕捉游戏中的屏幕。 (我按左键单击以捕获) 捕获工作正常(至少当我点击表单本身时),但只要我点击firefox或任何其他应用程序,我就会得到以下异常: 对类型为“CaptureScreen!”的垃圾回收委托进行了回调!CaptureScreen.Form1+WinEventDelegate::Invoke'。这可能会导致应用程序崩溃、损坏和数据丢失。当将委托传递给非托管代码时,托管应用程序必须使委托保持活动状态,直到保证永远不会调用委托为止 在my

我制作了一个非常小的应用程序,它使用SlimDX捕捉游戏中的屏幕。 (我按左键单击以捕获)

捕获工作正常(至少当我点击表单本身时),但只要我点击firefox或任何其他应用程序,我就会得到以下异常:

对类型为“CaptureScreen!”的垃圾回收委托进行了回调!CaptureScreen.Form1+WinEventDelegate::Invoke'。这可能会导致应用程序崩溃、损坏和数据丢失。当将委托传递给非托管代码时,托管应用程序必须使委托保持活动状态,直到保证永远不会调用委托为止

在my program.cs中的这一行:

Application.Run(新Form1())

My Form1.cs(设计器本身没有控件)

可在此处找到捕获屏幕的类:


你知道如何解决这个问题吗?

你的问题是,你只是将WinEventProc传递给SetWinEventHook,一旦当前方法退出(如果不是更早的话!),它将隐式创建一个符合GCD条件的委托。你看到了这一事实的后果

您需要创建WinEventDelegate类型的Form1新成员,并将其用作参数:

private WinEventDelegate winEventProc;
然后在调用SetWinEventHook时使用它:

this.winEventProc = new WinEventDelegate(WinEventProc);
m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, this.winEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);

这将确保您的代理在您需要的时间内保持活动状态。

有一个MSDN链接,可以帮助您解决问题。

我也遇到了这个问题,并且已经有了一个类似于@dlev的解决方案,但它不起作用。我发现,如果将成员标记为静态,则会阻止收集该成员


私有静态WinEventDelegate winEventProc

它仍然不会为游戏拍照(而是为桌面拍照),但您刚刚解决了我遇到的一个大问题,谢谢
this.winEventProc = new WinEventDelegate(WinEventProc);
m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, this.winEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);