当前位置:首页 > > 充电吧
[导读]封装好的类,直接添加到工程中就可以使用。注意:  这种方式可能会出一些意想不到的问题,比如在windows mobile平台,直接在C#程序中使用coredll.dll的钩子,可能导致cursor显示

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

注意:  这种方式可能会出一些意想不到的问题,比如在windows mobile平台,直接在C#程序中使用coredll.dll的钩子,可能导致cursor显示不正常,C#程序中启动新的其他进程,返回时点按键可能导致程序卡死等其他问题,虽然方便,但不建议如此使用钩子。建议的方式是用C++编译一个钩子程序,在C#程序中调用,这样,钩子和C#程序不在一个进程中,安全性更高一些。

/*这个类是用来屏蔽相关按键的,你可以new一个这个类的实例,然后调用相关的public方法就可以了,在C#程序中,你要在程序开始的位置调用,也就是Main函数中的窗体创建语句前调用开始钩子函数。在Main函数结束的位置再调用钩子关闭函数。将你想屏蔽的按键的键值添加到对应的位置,注释里面有解释,请查看。*/
	
	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 6.5下使用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 = "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_ESCAPE=0x1B,  	//ESC
			VK_RETURN=0x0D,	 	//RETURN,回车
			VK_APP5=0xC5,    	//蓝色FN
			VK_APP2=0xC2 ,   	//黄色FN
			VK_APP1=0xC1,	 	//WIN,菜单键
			VK_TEND = 0x73,  	//End,挂断键
			VK_TTALK = 0x72, 	//Talk,拨号键
			VK_TVOLUMEUP=0x75,	//音量+
			VK_TVOLUMEDOWN=0x76,//音量-
			VK_BACK=0x08,	 	//BKSP
			VK_SHIFT=0x10,		//SHIFT
			VK_TAB=0x09,		//TAB
			VK_TSTAR=0x77,		//*,星号
			VK_TPOUND=0x78,		//#,井号
            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
                {
                    //处理相关代码,需要屏蔽的按键在此case
                    switch (m.vkCode)
                    {
                        case (int)KeyValueMap.VK_TEND:                   //屏蔽掉挂断键
                        case (int)KeyValueMap.VK_TTALK:
                            {
                                return 1;
                            }
                    }
                }
            }
            return CallNextHookEx(hKeyboardHook, nCode, wParam,ref lParam);
        }
    }





本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭