C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决

http://www.csharpwin.com/csharpspace/3766r5747.shtml 在.net 2005平台下 在使用全局hook时,总是遇见SetWindowsHookEx的返回值为0,而且在: DllImport的SetLastError选项 = true的时候,调用Marshal.GetLastWin32Error() 也返回0,那么就看看是否这个原因:因为VS的调试模式的问题。 1.试试禁用宿主进程能否解决: 1). 在 Visual Studio 中打开项目。 2). 在“项目”菜单上单击“属性”。 3). 单击“调试”选项卡。 4). 清除“启用 Visual Studio 宿主进程”复选框。 2.或者,使用WINDOWS API函数代替获取当前实例的函数: 用: [DllImport("kernel32.dll")] public static extern IntPtr GetModuleHandle(string name); GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName) 代替: Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]) 当作 SetWindowsHookEx 的第三个参数: IntPtr hInstance 3. 如果程序可以成功安装键盘或鼠标的钩子,但是总是钩不到键盘和鼠标、或者回调函数一直不被回调,请尝试: 1) 检查你的项目是不是窗口应用程序(控制台程序不行),回调函数最好在主窗体的类中。原因似乎因为全局钩子回调需要寄宿在一个线程上,但是控制台应用程序中获得的当前实例(IntPtr hInstance)或许并不是当前程序的实例,而是一个控制台窗口的实例,回调的时候当然找不到回调函数了。 2) 是否使用的是这两个钩子”WH_KEYBORAD_LL 和 WH_MOUSE_LL“,而不是”WH_KEYBORAD和WH_MOUSE_LL“。因为在C#这种managed环境下,如果想实现全局钩子就必须使用low-level的hook。
原文地址:https://www.cnblogs.com/adodo1/p/4328228.html