全局钩子键盘记录问题的

全局钩子键盘记录问题的

本文介绍了全局钩子键盘记录问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

它记录的钥匙,文本框,目前所以它是安全的。



问题
现在的问题是,当我在虚拟机中运行这个,还是我朋友的笔记本电脑,
它按下按键的一定量后挂起(随机)。它运行在我的完美的罚款



 类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;

这篇关于全局钩子键盘记录问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 06:17