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
C#基础视频教程5.1 如何编写简单的超级热键的更多相关文章
- C#基础视频教程5.3 如何编写简单的超级热键
跟前面一章讲解计算器一样,到最后一小节,我们总是要把代码规整好,让整个程序显得非常简洁,先做个文件夹把我们自定义的类库都放进去 然后我们开始整理Form1里面的代码,为了实现超级热键的功能,我们应 ...
- C#基础视频教程5.2 如何编写简单的超级热键
我们前面已经理解了如何使用官方的代码实现鼠标键盘的监控,其实还差一点,因为他的代码只能捕捉单个的按键,而其实我们要的是组合键.什么是组合键呢?比如我想定义同时按下WIN+C是去执行屏幕截图.这只要理解 ...
- C#基础视频教程7.5 如何编写简单游戏
有一些BUG需要处理,比如小鸟太高或者太低都应该报错(不然直接掉到窗口下面去了),这个方法跟前面的HitTest应该独立开来,而不是掺和在一起 测试确实可以检测是否超过边界(如果要非常精确,那么就 ...
- C#基础视频教程7.3 如何编写简单游戏
前面我们大致实现了鸟的一圈轨迹(其实如果你不做这个,就用两个矩形块的碰撞检测代替也可以),跟所有前面的教程一样,草稿打完了就要设计封装成一个类.至少到目前为止我们已经知道了鸟的属性和方法,先不要管方法 ...
- C#基础视频教程7.2 如何编写简单游戏
前面一小节我们实现了简单的碰撞检测,但是实际上游戏的对象并不是一个标准的矩形(小鸟是一个不规则的物体,其实碰撞的管道也是不规则物体),所以如果真的要做的比较完美,我们自己要写一个方法,能够导入一个图像 ...
- C#基础视频教程4.3 如何编写简单的计算器
我们接着往下改,为了让这个计算器更加实用,我们要像官方的计算器一样可以接着计算(你算出来一笔数据之后,可以接着累加累减,我们暂时不考虑加括号,优先级之类的,因为绝大部分情况下我们打开计算器就是为了进行 ...
- C#基础视频教程4.2 如何编写简单的计算器
用过VB6或者早期代码的人都应该能感觉到,C#目前也没看出来有什么特别之处,所谓的面向对象也没有什么体现.所以我们需要在原有基础上重写一份代码,然后比较两种做法的优缺点.我们在项目上右击添加一个Fun ...
- C#基础视频教程7.4 如何编写简单游戏
接下来我们实现整个的游戏流程,当点击开始游戏,则需要三个事情开始运行 1 小鸟初始化并往下掉(当然还是可以用按钮让他飞一下) 2 每隔一定时间从左侧产生一个管子(宽度和高度随机,产生周期2000ms左 ...
- C#基础视频教程7.1 如何编写简单游戏
要做一个FlappyBird,最核心的功能是创建几个区块,如果发生碰撞则游戏结束(小鸟撞到管子上,或者小鸟到地上),至于随机生成一些管子,小鸟如何跳跃,最后如何统计分数,都不难想通要怎么做. 首先 ...
随机推荐
- JAVAEE学习——hibernate04:查询种类、HQL、Criteria、查询优化和练习为客户列表增加查询条件
一.查询种类 1.oid查询-get 2.对象属性导航查询 3.HQL 4.Criteria 5.原生SQL 二.查询-HQL语法 //学习HQL语法 public class Demo { //基本 ...
- Linux通过FTP上传文件到服务器
1.如果没有安装ftp,可执行: 输入:yum -y install ftp,回车 等待安装完毕 2.连接服务器 输入:ftp 服务器IP,回车 根据提示输入用户名和密码 3.上传下载操作 1). 上 ...
- T型知识实践结构的力量(转载)
最近在做的一些新的事情,这其中获得的一些新的思考. T型的知识积累,深度的挖掘可以通过"举一反三"的应用在广度上,广度可以通过"交叉验证"加强我们的认识,可以说 ...
- hihocoder #1076 与链 dp
直接背包不可做 我们只需要知道每个数位上有多少个$1$,那么我们就能构造出解 因此,我们对每一位讨论, 可以拆出$n + \frac{n}{2} + \frac{n}{4} + ... = 2n$个物 ...
- 如何使用Eclipse插件—Easy Explorer
Easy Explorer是一个Eclipse插件,主要用于快速浏览项目文件的目录,实用性比较强. 使用方法如下: 1.下载Easy Explorer,从此处下载EasyExplorer:http:/ ...
- 注解@Aspect实现AOP功能
springboot中pom引入jar <!-- aop 切面 --> <dependency> <groupId>org.springframework.boot ...
- 三周学会小程序第四讲:Heroku 绑定 Github 自动部署
这一讲是根据读者的反馈补充的一个讲解,好多读者反应安装 Heroku-cli 遇到问题,或者是操作繁琐,其实上一讲中提到的 Heroku 只是为了免费部署,而安装 Heroku-CLI只是为了部署,所 ...
- [bzoj1017][JSOI2008]魔兽地图 DotR (Tree DP)【有待优化】
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
- bzoj 2733: [HNOI2012]永无乡 -- 线段树
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...
- Java---线程多(工作内存)和内存模型(主内存)分析
首先解读Java内存模型(这里区别于JVM的内存模型,堆.栈.工作区) Java 内存模型来屏蔽掉各种硬件和操作系统的内存差异,达到跨平台的内存访问效果.JLS(Java语言规范)定义了一个统一的内存 ...