C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
2013-07-13 09:57
579 查看
在.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。
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。
相关文章推荐
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
- VS调试时SetWindowsHookEx返回0,全局钩子(hook)无效
- 【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题
- 使用SetWindowsHookEx(WH_KEYBOARD,...)制作全局键盘钩子
- SetWindowsHookEx原理(如何使用钩子,使用钩子hook其他进程的函数)
- c#+windows api SetWindowsHookEx 全局钩子 demo 下载
- c#+windows api SetWindowsHookEx 全局钩子 demo 下载
- C#编程技巧之钩子函数的使用——SetWindowsHookEx
- C#编程技巧之钩子函数的使用——SetWindowsHookEx
- 关于SetWindowsHookEx【HOOK钩子】
- 使用SetWindowsHookEx监控Windows全局鼠标事件
- 关于HOOK,如何通过钩子截获指定窗口的所有消息 SetWindowsHookEx demo
- 全局钩子函数之 SetWindowsHookEx
- SetWindowsHookEx-HOOK 钩子详细介绍
- SetWindowsHookEx设置全局键盘钩子
- SetWindowsHookEx设置全局钩子