c# 键盘勾子

       PowerPoint在放映模式下,如果用户按Esc键,PowerPoint直接退出放映模式。在查看了相关PowerPoint API没有找到PowerPoint退出放映模式前的事件,只好使用键盘勾子去捕获Esc按键。

    public class KeyboardHookDll
    {
        //Hook结构 
        [StructLayout(LayoutKind.Sequential)]
        public class HookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }

        //键盘 
        private const int WH_KEYBOARD_LL = 13; 

        //接收SetWindowsHookEx返回值
        private static int _hHookValue = 0;

        //钩子程序处理事件  
        private HookHandle _KeyBoardHookProcedure;

        //外部调用的键盘处理事件 
        private static ProcessKeyHandle _clientMethod = null;

        private IntPtr _hookWindowPtr = IntPtr.Zero;             

        //键盘处理事件委托 ,当捕获键盘输入时调用定义该委托的方法.  
        private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);

        //客户端键盘处理事件   
        public delegate void ProcessKeyHandle(HookStruct param, out bool handle);       
        
        //设置钩子
        [DllImport("user32.dll")]
        private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);

        //取消钩子   
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern bool UnhookWindowsHookEx(int idHook);

        //调用下一个钩子   
        [DllImport("user32.dll")]
        private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

        //获取当前线程ID  
        [DllImport("kernel32.dll")]
        private static extern int GetCurrentThreadId();

        //得到模块的句柄 
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetModuleHandle(string name);

        //构造器  
        public KeyboardHookDll() { } 

        /// <summary> 
        /// 安装勾子  
        /// </summary>
        /// <param name="hookProcess">外部调用的键盘处理事件</param>
        public void InstallHook(ProcessKeyHandle clientMethod)
        {
            _clientMethod = clientMethod;
            // 安装键盘钩子  
            if (_hHookValue == 0)
            {
                _KeyBoardHookProcedure = new HookHandle(OnHookProc);
                _hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
                _hHookValue = SetWindowsHookEx(
                    WH_KEYBOARD_LL,
                    _KeyBoardHookProcedure,
                    _hookWindowPtr,
                    0);

                //如果设置钩子失败.  
                if (_hHookValue == 0)
                {
                    UninstallHook();
                }
            }
        }

        /// <summary>
        /// 取消钩子事件
        /// </summary>
        public void UninstallHook()
        {
            if (_hHookValue != 0)
            {
                bool ret = UnhookWindowsHookEx(_hHookValue);
                if (ret)
                {
                    _hHookValue = 0;
                }
            }
        }

        /// <summary>
        /// 钩子事件内部调用,调用_clientMethod方法转发到客户端应用
        /// </summary>
        /// <param name="nCode"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        private static int OnHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                //转换结构
                HookStruct hookStruct = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));
                if (_clientMethod != null)
                {
                    bool handle = false;
                    //调用客户提供的事件处理程序。  
                    _clientMethod(hookStruct, out handle);
                    //1:表示拦截键盘,return 退出   
                    if (handle)
                    {
                        return 1;
                    }
                }
            }
            return CallNextHookEx(_hHookValue, nCode, wParam, lParam);
        }
    }

         安装键盘勾子    

    KeyboardHookDll hook = new KeyboardHookDll();
    hook.InstallHook(this.OnKeyPress); 

         客户端键盘捕捉事件

    public void OnKeyPress(KeyboardHookDll.HookStruct hookStruct, out bool handle)
    {
        handle = false; //预设不拦截任何键 
         if (hookStruct.vkCode == 27) // 截获ESC  
        {
            handle = true;
            //程序后续代码
          }
    }

         取消键盘勾子

    if (hook != null)
    {
        hook.UninstallHook();
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值