前几天写的键盘记录程序一直有个bug,没处理.
问题是这样的: 当我频繁不断的敲击键盘的时候, 过不一会儿,
程序就崩溃,自动关闭.
我的程序逻辑是这样的:
1: 首先,在系统钩子链表中注册一个全局键盘钩子.
2: 在这个键盘钩子的回调函数中转发键盘消息到我
的自处理线程.(转发时,设置标志位WM_User)
3: 在自处理线程中开一个循环. 不停的读取消息列表,
读到标志为WM_User的消息时,将其显示在ListBox中.
整个处理流程看起来很直观. 当时比较乱,一时间无法确定问题
到底出在哪里.
今天刚好有兴趣,翻出来代码详细看了下, 以Debug模式运行,
疯狂按了会儿键盘后, 程序抛出异常:
callbackOnCollectedDelegate
对“WindowsFormsApplication1!WindowsFormsApplication1.Form1+HookProc::Invoke”
类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。
向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
原来是托管与非托管间的破事儿. 在MSDN中搜索 “callba