线程键盘钩子

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
    }
相关文章
相关标签/搜索