C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
来源:互联网 发布:单片机电压表设计论文 编辑:程序博客网 时间:2024/06/05 10:29
在使用全局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。
0 0
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
- 使用SetWindowsHookEx(WH_KEYBOARD,...)制作全局键盘钩子
- 关于SetWindowsHookEx【HOOK钩子】
- SetWindowsHookEx原理(如何使用钩子,使用钩子hook其他进程的函数)
- SetWindowsHookEx设置全局钩子
- c# hook钩子的使用
- HOOK使用:全局键盘钩子
- HOOK使用:全局键盘钩子
- SetWindowsHookEx-HOOK 钩子详细介绍
- SetWindowsHookEx与全局共享钩子
- SetWindowsHookEx设置全局键盘钩子
- 全局钩子函数之 SetWindowsHookEx
- SetWindowsHookEx设置全局系统钩子
- hook钩子的使用
- C#编程技巧之钩子函数的使用——SetWindowsHookEx
- HOOK全局键盘钩子
- 记录自己常写的一些sql语句
- 设置 UILabel 和 UITextField 的 Padding 或 Insets (理解UIEdgeInsets)
- 外部和内部链接性和static关键字
- Android之SQLite分页表格
- 算法-求二进制数中1的个数
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
- jQuery load(url, [data], [callback])
- Mac安装Brew
- 一把杀猪刀之linux网络管理
- java 单例模式
- 链表中倒数第k个结点
- oracle decode函数使用方法
- ubuntu下最新版golang安装教程
- linux2.6内核Makefile详解(1)