`
ladymaidu
  • 浏览: 678877 次
文章分类
社区版块
存档分类
最新评论

实现自定义对话框程序快捷键的两种方法

 
阅读更多

作者:朱金灿

来源:http://blog.csdn.net/clever101

做一个项目,我的模块完成了(我的模块是对话框程序),但是别人的还没完成,我还得配合别人测试,具体就是单击按钮给别人发任务。做得多了我觉得用鼠标比较繁琐,于是我想到添加快捷键。我想着到时我都可以把屏幕关了只按键盘就行了,我按小键盘的数字键1就发任务1,按数字键2就发任务2……

给按钮定义快捷键,常规的做法有以下几种:

方法一 给按钮的 Caption 中写入特殊字符

如: 要给打开按钮加 快捷建 “Atl+O”,在 Caption 中写入打开(&O

方法二 注册系统热键:

1 声明热键消息处理函数原型
  在.h中消息映射声明处(AFX_mSG字样之后)加入如下语句:

2 消息与相应处理函数相关联
  在.Cpp中加入消息映射宏,使消息与相应处理函数发生关系,
ON_MESSAGE(WM_HOTKEY,OnHotKey);


3
为方便以后的操作
  预先在类中创建一个响应WM_CREATEWM_DESTROY消息的函数
OnCreate()
OnDestroy()的框架


4
.向系统登记热键
  在OnCreate()函数中加入如下代码以向系统登记热键,本例子的热键设为
Ctrl
ShiftA.

 5.处理热键


  在消息处理函数OnHotKey()中对热键进行处理,并可加入用户希望运行的程序代码

6.程序运行完毕后解除热键
  在OnDestroy()中通过UnRegisterHotKey()解除热键登记,释放系统资源.

 7.编译并运行程序

这两种方法都有共同的弊端,就是必须使用组合键,那就是我必须动用两个手指头。我决心实现只需一个手指头就够了。开始我以为只要响应WM_CHAR消息消息就行了,后来发现不行,因为当一个对话框中什么都没有的时候,ONCHAR 事件才能给窗体接收到,否则默认的消息传递都是给输入焦点的窗口。经过一番功夫,我找到了两种方法:

方法一 利用键盘钩子:

简单介绍一下键盘钩子需要用到的函数:

WINDOWS调用挂接的回调函数时首先会调用位于函数链首的函数,我们只要将自己的回调函数置于链首,该回调函数就会首先被调用。那么如何将我们自己的回调函数置于函数链的链首呢?函数SetWindowsHookEx()实现的就是该功能。我们首先来看一下SetWindowsHookEx函数的原型:

第一个参数:指定钩子的类型,有WH_MOUSEWH_KEYBOARD等十多种(具体参见MSDN)
第二个参数:标识钩子函数的入口地址
第三个参数:钩子函数所在模块的句柄;
第四个参数:钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息。

具体实现是这样的:

运行VS 2005建一个MFC对话框程序,然后开始添加代码:

1. 定义一个全局的钩子句柄:

2. 定义钩子回调函数:

3.在对话框OnInitDialog()函数调用SetWindowsHookEx函数来设置键盘钩子:

4. 对话框的析构函数里卸载钩子:

if(hkb)

UnhookWindowsHookEx(hkb);

方法二更为简单,就是重载PreTranslateMessage函数,具体代码如下:

参考文献:

<1>利用键盘钩子开发按键发音程序,作者:GDGFhttp://www.vckbase.com/document/viewdoc/?id=271

<2>为什么对话框不出理WM_CHAR消息, http://topic.csdn.net/t/20030622/19/1944358.html

<3> 钩子函数初步掌握篇,http://www.qqgb.com/Program/VC/VCZH/Program_54891.html

分享到:
评论

相关推荐

    word+xp技巧100例

    Word XP任务窗格通常采用以下两种方法打开:一是选中“视图”菜单下的“任务窗格”。二是用鼠标右键单击工具栏,选中快捷菜单中的“任务窗格”。如果您经常使用任务窗格,可以给它指定一个快捷键,从而提高其操作...

    Eclipse_Swt_Jface_核心应用_部分19

    11.1.2 创建线程的两种方式 231 11.2 SWT中的UI线程 234 11.3 其他线程访问UI线程 234 11.4 改进的进度条 236 11.5 多线程程序设计 238 11.6 本章小结 243 第12章 SWT系统资源 244 12.1 系统资源概述 ...

    vc++ 应用源码包_1

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    WIN7实验报告.doc

    2、在不同的选项卡之间的切换 方法1: 方法2: 3、在选项卡内的切换 方法1: 方法2: (五)菜单及其基本操作 1、菜单名后有"…"的菜单表示: 2、名字后带字母的菜单项表示: 3、执行菜单命令,至少可采用两种方式...

    vc++ 应用源码包_2

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 应用源码包_6

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    7.添加资源有两种方法。一种是直接添加系统提供的资源文件,然后选择所需图 标。另一种是自己写资源文件。我们主要介绍第一种。新建Qt Resources file, 将它命名为menu。其他默认。 8.添加完后如下图。可以看到添加...

    vc++ 应用源码包_5

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 应用源码包_3

    压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 vcdialog 自...

    vc++ 开发实例源码包

    6:自定义快捷键. 7:在IE工具栏上加按钮,可以直接拖动连接到按钮上下载. 8:注册采用激活方式. 9:采用Messenger的弹出滑动消息提示框. 10:下载管理,虚拟文件夹. 11:自动ping. 12:连接到搜索引擎. 13:自动报告bug,建议...

    多显示器管理工具 DisplayFusion Pro 9.7 中文多语免费版.zip

    任何功能,包括您创建的自定义功能都可以分配标题栏按钮,借此即可实现更快捷的鼠标访问,惯用键盘的用户也可以分配自定义的键盘快捷键。功能还可以分配给 DisplayFusion 多显示器任务栏的跳转列表菜单,这样就可以...

    分子量计算器 6.6.0

    + 保存历史记录支持纯文本以及RTF两种格式 + 将元素统计结果复制到剪贴板时将有更多选择 + 简易模式窗口可以自动隐藏 - 彻底解决了当化学式中存在缩写基团时可能会发生的问题 * 程序启动时自动判断是否安装...

    易语言程序免安装版下载

     支持静态链接其它编程语言(如C/C++、汇编等)编译生成的静态库(.LIB或.OBJ),但仅限于COFF格式,支持cdecl和stdcall两种函数调用约定。  使用说明如下:函数声明和调用方法与DLL命令一致;“库文件名”以.lib...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例021 重定向输出流实现程序日志 31 实例022 自动类型转换与强制类型转换 33 2.2 运算符 34 实例023 加密可以这样简单(位运算) 34 实例024 用三元运算符判断奇数和偶数 35 实例025 更精确地使用浮点数 35 实例...

    asp.net知识库

    在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值...

    阿香婆截图软件v7.0中文注册版.rar

    视频编码:程序有两种视频编码可供选择,第一个适合捕获典型的windows应用程序或是桌面环境,第二个适合用于录制视频、或其他快速移动的高色彩的内容。你还可以从麦克风录制声音,一些声卡还支持录制所输出的声音。...

Global site tag (gtag.js) - Google Analytics