咱们上一节介绍了编写简单计算器,实际上也是出于实用角度(这个计算器只要你肯改,确定能作的比微软自带的计算器好用)。这一节介绍作简单的超级热键(所谓的超级热键是指自定义快捷键的功能) 编程
超级热键的最关键一步是绑定键盘钩子,就是键盘按下一组快捷键,主窗体可以响应(本身作不了或者想不到怎么作,就要百度搜别人有没有成熟的能够借鉴),先来看别人的范例程序(了解什么是带类库输出的项目,右击能够修改为Demo测试运行,直接运行报错) 编辑器
也要学会能生成类库和使用类库,例如咱们新建一个类库的项目,看起来跟传统C#项目没什么区别 学习
把上一节咱们写的FunctionMath这个类直接复制替换掉默认内容,注意引用了System.Windows.Forms,也要在项目引用中右击添加引用 测试
点击生成,从新生成解决方案,就能够看到在Debug目录下生成了对应的类库DLL文件(你也能够修更名字) spa
那么如何在当前的项目中使用本身写的类库呢?把这个DLL复制到你新的项目的Debug目录下,而后右击当前项目添加这个DLL的引用 线程
这样新的项目就能够添加以前DLL的引用并使用咱们本身定义的属性和方法了 3d
咱们再看一下对比,在咱们定义FunctionMath的方法的时候,都加了一个前缀叫作static,这个static就是静态的意思。为了对比,咱们再在原有的类库基础上复制一份,把static的修饰词都去掉,而后从新生成DLL orm
把这个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