public class KeyboardHook { #region ---------导入DLL-------- //使用钩子,须要使用WindowsAPI函数,因此要先声明这些API函数。 /// <summary> /// 安装键盘钩子 /// </summary> /// <returns></returns> [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); /// <summary> /// 卸载键盘钩子 /// </summary> /// <param name="idHook"></param> /// <returns></returns> [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); /// <summary> /// 继续下一个钩子 /// </summary> /// <param name="idHook"></param> /// <param name="nCode"></param> /// <param name="wParam"></param> /// <param name="lParam"></param> /// <returns></returns> [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); /// <summary> /// 得到得当前线程编号 /// </summary> /// <returns></returns> [DllImport("kernel32.dll")] static extern int GetCurrentThreadId(); #endregion #region -----声明,定义委托----- public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); static int hKeyboardHook = 0;//若是hKeyboardHook不为0则说明钩子安装成功 HookProc KeyboardHookProcedure; #endregion #region ------钩子处理程序------ //钩子所要处理的事情 private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr IParam) { //处理过程。。。。。。 // return CallNextHookEx(hKeyboardHook, nCode, wParam, IParam); } #endregion #region -----启用或卸载钩子----- //钩子安装 public void HookStart() { if (hKeyboardHook == 0)//若是hKeyboardHook==0,钩子安装失败 { //建立HookProc实例 KeyboardHookProcedure = new HookProc(KeyboardHookProc);//若是直接用KeyboardHookProc委托会被提早释放掉致使出错 //设置线程钩子,此处参数为2表示安装一个挂钩处理过程对击键消息进行监视 hKeyboardHook = SetWindowsHookEx(2, KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId()); if (hKeyboardHook == 0) { throw new Exception("安装钩子失败"); } } } //钩子卸载 public void HookStop() { bool retKeyboard = true; if (hKeyboardHook != 0) { retKeyboard = UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = 0; } if (!retKeyboard) throw new Exception("卸载钩子失败"); } #endregion }