日期:2014-05-18  浏览次数:21734 次

C#,委托回调函数的问题!!!!CallbackOnCollectedDelegate异常
小弟初学c#,在做一个调用hook来响应键盘按键的。
说下我要实现的功能,在form上定义几个 textbox,当在每个textbox中敲击键盘时,textbox.txt变为键盘的虚拟键值。
我打算用SetWindowsHookEx线程钩子来做,基本已经实现了,可是出现了一个小问题,就是当我按到第 6-7个键时 出现如下异常

对“KillKael!KillKael.Form1+HookProc::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。

估计是垃圾机制把我的委托回收了
在网上找了一下,发现说要把委托定义成为成员变量,我就是这么定义的啊,如下

  public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);

  private static HookProc KeyboardHookProcedure;//这里不管是不是static都不行

 
  ...
  另外我在一个hookstart()方法中是{
  KeyboardHookProcedure = new HookProc(KeyboardHookProc);
  hKeyboardHook = SetWindowsHookEx(2, KeyboardHookProc, IntPtr.Zero, GetCurrentThreadId());
  }
这个方法只在form()构造时调用一次

还有一种说法是这么写GC.KeepAlive(KeyboardHookProcedure);
可是仍然是毫无用处,都是在大约第6个时出现异常

求达人解决啊!!!

------解决方案--------------------
正常来说 private HookProc KeyboardHookProcedure; 就可以保持了。

话说,你这需求 控件的 KeyPress 事件不就可以实现了么?还要用钩子吗?

还是说你在 Callback 里没有调用:CallNextHookEx?