本文介绍了全局钩子键盘记录问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
它记录的钥匙,文本框,目前所以它是安全的。
问题
现在的问题是,当我在虚拟机中运行这个,还是我朋友的笔记本电脑,
它按下按键的一定量后挂起(随机)。它运行在我的完美的罚款
的
类GlobalKeyboardHook
{
#区域的结构,常量和委托
公共委托INT KeyboardHookProc定义(INT nCode,wParam中诠释,楼盘GlobalKeyboardHookStruct的lParam) ;
公共结构GlobalKeyboardHookStruct
{
公众诠释vkCode;
公众诠释扫描码;
公众诠释标志;
公众诠释的时间;
公众诠释dwExtraInfo;
}
const int的WM_KEYDOWN = 0x100的;
const int的WM_KEYUP = 0x101;
const int的WM_SYSKEYDOWN =量0x104;
const int的WM_SYSKEYUP = 0x105;
const int的WH_KEYBOARD_LL = 13;
#endregion
#地区的活动
公共事件KeyEventHandler的KeyDown;
公共事件KeyEventHandler的KeyUp;
#endregion
#地区的实例变量
公开名单<&按键GT; HookedKeys =新的List<&按键GT;();
IntPtr的hookHandle = IntPtr.Zero;
#endregion
#地区的DLL进口
函数[DllImport(KERNEL32.DLL)]
静态外部的IntPtr调用LoadLibrary(串lpFileName的对象);
函数[DllImport(user32.dll中,字符集= CharSet.Auto,CallingConvention = CallingConvention.StdCall,SetLastError = TRUE)]
静态外部的IntPtr SetWindowsHookEx函数(INT hookID,KeyboardHookProc回调,IntPtr的实例句柄,UINT主题ID);
函数[DllImport(user32.dll中,字符集= CharSet.Auto,CallingConvention = CallingConvention.StdCall,SetLastError = TRUE)]
静态的extern BOOL UnhookWindowsHookEx(IntPtr的hookHandle);
函数[DllImport(user32.dll中,字符集= CharSet.Auto,CallingConvention = CallingConvention.StdCall)]
静态外部INT CallNextHookEx方法(IntPtr的hookHandle,诠释nCode,诠释的wParam,楼盘GlobalKeyboardHookStruct lParam的);
#endregion
#地区的公共方法
公众诠释HOOKPROC(INT nCode,INT wParam中,参考GlobalKeyboardHookStruct lParam的)
{
如果(nCode> = 0)
{
键键=(键)lParam.vkCode;
如果(HookedKeys.Contains(键)== true)而
{
KeyEventArgs KEA =新KeyEventArgs(密钥);
如果((的wParam == || WM_KEYUP的wParam == WM_SYSKEYUP)及和放大器;!=的KeyUp NULL)
{
的KeyUp(这一点,KEA);
}
,否则如果((的wParam == WM_KEYDOWN ||的wParam == WM_SYSKEYDOWN)及和放大器;!=的KeyDown NULL)
{
的KeyDown(这一点,KEA);
}
如果(kea.Handled)返回1;
}
}
返回CallNextHookEx方法(hookHandle,nCode,wParam中,裁判的lParam);
}
公共无效挂钩()
{
IntPtr的实例句柄调用LoadLibrary =(USER32);
hookHandle =调用SetWindowsHookEx(WH_KEYBOARD_LL,HOOKPROC,实例句柄,0);
}
公共无效脱钩()
{
UnhookWindowsHookEx(hookHandle);
}
#endregion
#地区的构造和析构
公共GlobalKeyboardHook()
{
挂钩();
}
〜GlobalKeyboardHook()
{
脱钩();
}
#endregion
解决方案
尝试与调试应用程序的CallbackOnCollectedDelegateMDA开启(调试 - >例外 - >托管调试助手 - >勾选CallbackOnCollectedDelegate)。
的
这里常见的错误是,你的钩子程序委托自动由GC收集设置后勾(它被创建为在P的一部分/调用编组到和SetWindowsHookEx
) 。在GC收集委托后,程序试图调用回调时崩溃。这也可以解释的随机性
如果这是你的问题,你会看到如下的错误:
Try keeping a reference to your hook procedure as a member in your class, e.g.:
public delegate int KeyboardHookProc(int nCode, int wParam, ref GlobalKeyboardHookStruct lParam);
public int hookProc(int nCode, int wParam, ref GlobalKeyboardHookStruct lParam)
{
// ...
}
public void hook()
{
_hookProc = new KeyboardHookProc(hookProc);
IntPtr hInstance = LoadLibrary("user32");
hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, _hookProc, hInstance, 0);
}
KeyboardHookProc _hookProc;
这篇关于全局钩子键盘记录问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!