windows mobile 键盘钩子 屏蔽按键

本文深入探讨了在Windows环境下使用C++实现键盘钩子的原理与实践,包括安装与卸载钩子的过程,以及钩子回调函数的具体用法。

封装好的类,直接添加到工程中使用。

    public class KeyBoardHookClass
    {
        public delegate int HookProc(int nCode, int wParam,ref KeyMSG lParam);         //声明代理,用于回调函数
        private static int hKeyboardHook = 0;
        private HookProc KeyboardHookProcedure;

        //win32下使用user32.dll  windows mobile 下使用coredll.dll

        //设置钩子
        [DllImport("coredll.dll",EntryPoint = "SetWindowsHookEx")]
        public static extern int SetWindowsHookEx(HookType idHook, HookProc lpfn, IntPtr hInstance, int threadId);
        //抽调钩子
        [DllImport("coredll.dll", EntryPoint = "UnhookWindowsHookEx")]
        public static extern bool UnhookWindowsHookEx(int idHook);

        [DllImport("coredll.dll", EntryPoint = "GetCurrentThreadId")]
        public static extern int GetCurrentThreadId();

        [DllImport("coredll.dll", EntryPoint = "GetModuleHandle")]
        public static extern IntPtr GetModuleHandle(string name);

        [DllImport("coredll.dll", EntryPoint = "CallNextHookEx")]
        public static extern int CallNextHookEx(int idHook, int nCode, int wParam, ref KeyMSG lParam);

        //钩子类型
        public enum HookType
        {
            WH_KEYBOARD = 2,
            WH_KEYBOARD_LL = 20
        }

        //键值枚举
        public enum KeyValueMap : int
        {
            VK_TEND = 0x73,                   // 挂断键
            VK_TTALK = 0x72,                  //拨号键
            WM_KEYDOWN = 0x0100,
            WM_KEYUP = 0x0101,
            WM_SYSKEYDOWN = 0x0104,
            WM_SYSKEYUP = 0x0105
        }

        //键盘结构 
        public struct KeyMSG
        {
            public int vkCode; //键值 
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }

        public void StartHook()
        {
            //安装键盘钩子   
            try
            {
                KeyboardHookProcedure = new HookProc(KeyboardHookProc);
                hKeyboardHook = SetWindowsHookEx(HookType.WH_KEYBOARD_LL, KeyboardHookProcedure, IntPtr.Zero, 0);
            }
            catch (Exception ex)
            {
                StopHook();
                throw new Exception(ex.ToString() + "安装钩子失败.");
            }
        }
        public void StopHook()
        {
            try
            {
                UnhookWindowsHookEx(hKeyboardHook);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString() + "卸下钩子失败.");
            }
        }

        //钩子回调函数
        private int KeyboardHookProc(int nCode, int wParam, ref KeyMSG lParam)
        {
            if (nCode >= 0)
            {
                //Keys keyData = (Keys)wParam;                            //wParam用于判断是按键按下还是弹起
                KeyMSG m = (KeyMSG)lParam;
                if (wParam == (int)KeyValueMap.WM_KEYDOWN || wParam == (int)KeyValueMap.WM_KEYUP || wParam == (int)KeyValueMap.WM_SYSKEYDOWN || wParam == (int)KeyValueMap.WM_SYSKEYUP)                             //key down
                {
                    //处理相关代码
                    switch (m.vkCode)
                    {
                        case (int)KeyValueMap.VK_TEND:                   //屏蔽掉挂断键
                        case (int)KeyValueMap.VK_TTALK:
                            {
                                return 1;
                            }
                    }
                }
            }
            return CallNextHookEx(hKeyboardHook, nCode, wParam,ref lParam);
        }
    }



转载于:https://www.cnblogs.com/snake-hand/archive/2013/06/05/3119946.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值