各位大师,在.net3.5下调用Win32API SetWindowsHookEx成功,可是切换为4.0版本后,无一例外地返回0(失败)。把钩子过程用Marshal.GetFunctionPointerForDelegate转换为指针也不起作用。是什么地方没有协调好呢?这个问题困扰我很久了。是不是从.net4.0以后微软彻底封杀钩子函数,那样的话岂不是自己做套类库还得分3.0、4.0的,也太不方便了。

解决方案 »

  1.   

    没出现这个问题
    全局钩子不是一直都是在IDE里运行不了,要直接运行.exe文件才能用么
      

  2.   

    哎哟喂 终于看到通通道中人了、、、这几天Hook都快把我弄哭了、、hHook = SetWindowsHookEx(14, MouseHook, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
                //hHook = SetWindowsHookEx(14, MouseHook, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);看见网上的都是用的上面那句 我用上面那句 oh yeah 一直没有成功过 用下面那句吧虽然成功了 要是是键盘钩子还好 如果是全局鼠标 程序顶多5秒后 提示崩溃、、、
    A callback was made on a garbage collected delegate of type 'ChoseHwnd!ChoseHwnd.Form1+HookProc::Invoke'. This may cause application crashes, corruption and data loss. When passing delegates to unmanaged code, they must be kept alive by the managed application until it is guaranteed that they will never be called.
    这个是错误提示、、、哎哟 我都不知道怎么办了、、、
      

  3.   

    回调是一个垃圾收集代表的chosehwnd类型!chosehwnd。For m1+HOOK PROC::调用'。这可能导致应用程序崩溃,损坏和数据丢失。当通过代表非托管代码,他们必须保持活力的托管应用程序之前,这是保证他们不会被称为。
    这个百度翻译出来的错误提示(哎哟怎么看怎么不像是正常翻译过来的)
      

  4.   

    楼上
    GCHandle gc = GCHandle.Alloc(你的回调函数);
    用完了再gc.Free();
      

  5.   


    哈哈 谢谢啦 貌似问题解决了 至少 我运行了 这么久 没有提示程序崩溃 刚才 msdn看了一下这个GCHandle 机制用于在 GCHandleType 枚举创建句柄与所有托管对象相对应。 此句柄可为以下四种类型之一:Weak、WeakTrackResurrection、Normal 或 Pinned。 分配了句柄以后,在非托管客户端保留唯一的引用时,可以使用它防止垃圾回收器回收托管对象。 如果没有这样的句柄,则在该对象代表非托管客户端完成工作以前,有可能被垃圾回收器回收。 还可以使用 GCHandle 创建一个固定对象,该对象返回一个内存地址,并防止垃圾回收器在内存中移动该对象。 当该句柄超出范围时,您必须通过调用 Free 方法显式释放它;否则,可能会发生内存泄漏。 当您释放固定的句柄时,如果没有对关联对象的其他引用,则关联对象将解除固定,并可以被当成垃圾回收
      

  6.   

    根据楼主的提示 今天 貌似 我用3.5的版本设置Hook成功了 用的是上面那句
    刚才根据 哪位仁兄的提示、、在4.0下 也搞定了 、、、
      

  7.   

    貌似4.0是有点问题,EasyHook死活注册不上GAC,一改3.5就成功了
    有人遇到过吗