C#基础视频教程5.1 如何编写简单的超级热键

我们上一节介绍了编写简单计算器,实际上也是出于实用角度(这个计算器只要你肯改,肯定能做的比微软自带的计算器好用)。这一节介绍做简单的超级热键(所谓的超级热键是指自定义快捷键的功能)

超级热键的最关键一步是绑定键盘钩子,就是键盘按下一组快捷键,主窗体能够响应(自己做不了或者想不到怎么做,就要百度搜别人有没有成熟的可以借鉴),先来看别人的范例程序(了解什么是带类库输出的项目,右击可以修改成Demo测试运行,直接运行报错)

 

也要学会能生成类库和使用类库,例如我们新建一个类库的项目,看起来跟传统C#项目没什么区别

 

把上一节我们写的FunctionMath这个类直接复制替换掉默认内容,注意引用了System.Windows.Forms,也要在项目引用中右击添加引用

 

点击生成,重新生成解决方案,就可以看到在Debug目录下生成了对应的类库DLL文件(你也可以修改名字)

 

那么如何在当前的项目中使用自己写的类库呢?把这个DLL复制到你新的项目的Debug目录下,然后右击当前项目添加这个DLL的引用

 

这样新的项目就可以添加之前DLL的引用并使用我们自己定义的属性和方法了

 

我们再看一下对比,在我们定义FunctionMath的方法的时候,都加了一个前缀叫做static,这个static就是静态的意思。为了对比,我们再在原有的类库基础上复制一份,把static的修饰词都去掉,然后重新生成DLL

 

把这个DLL覆盖掉之前的(注意以后写代码也只要这样,把一个类库更新之后直接覆盖掉原来的,就相当于更新模块代码了,这也是C#比较高效的地方,新的代码比老的多,所以生成的DLL也比之前要大一点)

 

我们发现这个可以自动代码提示FunctionMath2,但是无法找到他的任何方法,因为这个类已经不是静态的了(静态的类不需要声明类的实例,直接类名.方法名

 

那么如何使用FunctionMath2的方法呢?首先new一个类的实例(非静态的类需要声明类的实例,然后实例名.方法名)。那么从目前这个角度考虑,貌似static的更加省事,想用随时用,不需要new实例,如果你代码几千几万行,你可能记不得那么多类的实例名称。但是有一些情况下,用new声明类的实例更加有意义(比如后面讲解通信的时候,你可能同时需要10个通信的实例在运行,每个实例的端口,连接的客户端都是不一样的,那么这个时候就应该分分清楚,就像你有十个销售,虽然每个销售职责都是一样的,但是每个销售负责的客户都是不同的,你认为把所有销售任务都丢给一个人完成合适还是分开了合适?)

 

这里再补充一点,修改代码的时候,要用一些第三方编辑器,比如UltraEdit(也可以用别的比如Notepad++),这些第三方编辑器比记事本或者word好用多了,有显示行号,代码高亮等等功能。我们为了测试static的事情,可以把static 都替换成空(注意是static+空格替换掉,否则会在public和double之间有两个空格),使用第三方编辑器可以显著的提高编程效率。

 

理解了static的作用,我们再来理解一下private的作用。如果把某个方法的前缀从public改成private,那么我们在使用的时候就无法访问这个方法了,因为这个方法不对外公开(私有=》private),那么为什么要有这个私有的方法呢?比如你写一个很复杂的类库,里面有大量的中间运算,A方法调用B,B调用C,但是这个类库对外却需要保持干净(比如数学方法,不管内部多么复杂,对外就是加减乘除的基本运算,至于你内部怎么实现的不管,或者你也不想让别人访问,弄多了反而让人觉得乱,弄错了还要说你这个有问题)。

 

需要注意的是,除了方法可以区分public/private,是否有static,类本身,以及类的属性也是可以加这样的修饰符的。比如我可以在FunctionMath中定义一个圆周率的全局变量(自定义的精度3.1415,这样下面所有方法都可以统一使用这个圆周率)

 

那么如果一旦给类本身添加了static的属性,他下面所有的属性和方法都要求是static的(一般不需要这么做)

 

有了这些对类和DLL的认识之后,我们马上把人家线程的类库放到自己的程序里。比如还是这个程序,我们勾选了检测KeyDown之后,就可以在下面的文本框中检测到键盘的动作(别的鼠标动作也能检测,可以自己测试)

 

查看控件勾选之后执行的具体代码

 

再讲的明白一点,为了知道这个m_KeyboardHookManager是什么玩意,可以右击这个对象,转到定义(结果定位显示他是KeyboardHookListener类的一个实例,也就是他拥有KeyboardHookListener的所有事件,属性和方法)

 

那么KeyboardHookListener有多少属性和方法呢?我们只是知道了KeyDown的事件,接着对我们感兴趣的KeyboardHookListener右击查看定义,可以找到他有三个事件(键盘按下,键盘弹起,键盘按压,貌似键盘也就只能有这三种事件了)。

 

这里我们又引入了一个新的名词事件(event),事件很好理解,就是发生了什么事情。最常见的控件的事件,比如按钮的点击事件,键盘的按下事件,当然也有别的事件,比如关机事件,QQ收到一条消息事件,这些都是事件。要完整把一个控件对应的事件搞透是不显示的,仅仅这个复选框就有这么多的事件,我们只需要掌握最常见的几种即可(而且在这一节我们暂时不对事件-委托的内容作详细说明,后面会结合更加实际的范例讲解,事件-委托机制还是C#非常重要的一个内容,读者既要能看懂别人定义的事件-委托,也要自己能在自己的类库中写这样的事件-委托,这一章节我们只要简单的会用即可)

 

我们照抄范例代码,声明类和类的实例,同时在同样的地方初始化类(会抄别人的代码是基本技能,不要觉得丢人,抄也抄不像就谈不上创新)

 

引用完了,声明完了,接下来就是使用的部分。我们可以理解为,如果复选框checkBox1被勾选,则m_KeyboardHookManager的KeyDown事件发生之后,就让HookManager_KeyDown方法执行(至于m_KeyboardHookManager为什么能够随时响应我们的键盘的KeyDown事件,我们就不需要操心了,人家封装好的类库,这里我们只要会用),你随时可以右击方法找到具体干什么,这里我们只是让某个文本框显示刚才的按键,跟范例代码差不多。

 

来验证一下我们的功能,确实可以了(读者也可以接着学习如何把响应鼠标的部分移植过来,这里就不做深入探讨了)

 

需要说明的是,绑定键盘钩子的方法不止一个,在附件的参考代码中,我也给出了别人的其他做法(比如调用WIN API参数什么的,不用考虑业务逻辑也能直接构建组合热键,读者也可以移植他们的代码)

 

 

更多教学视频和资料下载,欢迎关注以下信息:

我的优酷空间:

http://i.youku.com/acetaohai123

 

我的在线论坛:

http://csrobot.gz01.bdysite.com/

 

问题交流:

QQ:910358960

邮箱:acetaohai123@163.com

 

 

 

原文地址:https://www.cnblogs.com/acetaohai123/p/7586686.html