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
    }

 

posted on 2016-07-13 09:14  江春暮雪  阅读(471)  评论(0编辑  收藏  举报