C#实现键盘钩子
2015-06-29 23:04
369 查看
前言:
因为项目中需要使用到快捷键,所以上网找资料了解关于快捷键的实现技术,于是有了键盘钩子的使用学习。在网上了解到,键盘钩子其实只是很多种钩子中的其中一种。所谓钩子:请看下面关于钩子的描述(来自百度百科):
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
本文我们主要来谈谈全局钩子和进程钩子的使用。
全局钩子:全局钩子,能够截获所有运行在操作系统上的程序发送的消息,但是因其全局性,钩子安装之后,会比较损耗性能,在使用完毕之后,必须实时的卸载。
进程钩子:可以针对某一个进程,仅仅截获某一个应用程序的消息,比较具有针对性,适用于普通的信息管理系统。
钩子程序是封装在User32.dll中的方法,如果我们的程序需要用到钩子,首先需要将钩子对应的程序集导入到我们的系统中。代码如下:
客户端调用
因为项目中需要使用到快捷键,所以上网找资料了解关于快捷键的实现技术,于是有了键盘钩子的使用学习。在网上了解到,键盘钩子其实只是很多种钩子中的其中一种。所谓钩子:请看下面关于钩子的描述(来自百度百科):
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。
本文我们主要来谈谈全局钩子和进程钩子的使用。
全局钩子:全局钩子,能够截获所有运行在操作系统上的程序发送的消息,但是因其全局性,钩子安装之后,会比较损耗性能,在使用完毕之后,必须实时的卸载。
进程钩子:可以针对某一个进程,仅仅截获某一个应用程序的消息,比较具有针对性,适用于普通的信息管理系统。
钩子程序是封装在User32.dll中的方法,如果我们的程序需要用到钩子,首先需要将钩子对应的程序集导入到我们的系统中。代码如下:
private KeyBoardHook hook; /// <summary> /// 创建进程键盘钩子 /// </summary> protected void CreateProcessHook() { if (hook != null) { hook.UnInstall(); } //使用工厂类创建出对应的钩子。 hook = KeyBoardHookHelper.CreateHook(KeyBoardHookType.Process); if (hook.Install(ClientProcessKeyHandle)) { hook.HookKey = this.GetHashCode(); } } //客户端传给钩子的监听方法。 private void ClientProcessKeyHandle(int hookKey, Keys key, out bool handle) { handle = false; if (hookKey == hook.HookKey) { OnClientProcessKeyHandle(key, out handle); } return; } /// <summary> /// 子类重写键盘钩子处理方法(系统中存在多个窗体,可将该代码放入到窗体基类中,子类只需重写该方法即可。) /// </summary> /// <param name="key"></param> /// <param name="handle"></param> protected virtual void OnClientProcessKeyHandle(Keys key, out bool handle) { handle = false; //截获消息并进行处理。 if ((int)key == (int)Keys.F2)//保存, { OnSaveOrder(this.tsbtn_Save); handle = true; } }
客户端调用
相关文章推荐
- C# 基础 new 、override实现多台区别
- C# StatusStrip 操作
- C#学习笔记__容器控件的使用
- (译)Asynchronous programming and Threading in C# (.NET 4.5)
- VS2010Datatable查看器查看超时(Microsoft.VisualStudio.DebuggerVisualizers)
- c#中DropDownList控件绑定枚举数据
- C#趣味程序---真分数序列
- C#趣味程序----分数之和
- C#中的线程(三) 使用多线程
- C#中的线程(二) 线程同步基础
- C#中的线程(一)入门
- C# 键值对排序
- C#趣味程序---求两个数的最大公约数和最小公倍数
- J技术债务C#--防盗链
- C# 使用 Socket
- C#分析URL参数获取参数和值得对应列表
- C#验证类(使用正则表达式)
- C#高级编程三十二天----数组基础
- C# zip压缩 Ionic.Zip.dll
- Mono制作安装包让C#桌面应用程序脱离net framework步骤