实现自定义对话框程序快捷键的两种方法是什么,实现自定义对话框程序快捷键的两种方法为
作者:朱
资料来源:http://blog..net/clever101
做一个项目,我的模块完成了(我的模块是对话程序),别人的还没完成。我要配合别人测试,具体来说就是点击按钮给别人发任务。做了这么多,觉得用鼠标很繁琐,就想到加快捷键。我想我可以关掉屏幕,只按键盘。我按键盘上的数字键1发送任务1,按数字键2发送任务2.
要定义按钮的快捷键,常规做法如下:
方法一将特殊字符写入按钮的标题中。
例如,要将“Atl O”添加到“打开”按钮,请在标题中写“open (o)”。
方法二。注册系统热键:
1声明热键消息处理程序的原型。
在中的消息映射声明处添加以下语句。h(在单词AFX_mSG之后):
2.该消息与相应的处理功能相关联。
将消息映射宏添加到中。Cpp使消息与相应的处理功能有关系,
ON_MESSAGE(WM_HOTKEY,ON HOTKEY);
3.为了以后操作的方便
预先在类中创建一个响应WM_CREATE和WM_DESTROY消息的函数。
OnCreate()和OnDestroy()的框架
4.向系统注册热键。
将下面的代码添加到OnCreate()函数中,向系统注册热键。在本例中,热键设置为
Ctrl+Shift+A。
5.处理热键
在消息处理函数OnHotKey()中,对热键进行处理,可以添加用户想要运行的程序代码。
6.程序运行后释放热键。
在OnDestroy()中取消注册HotKey()以释放系统资源。
7.编译并运行程序。
这两种方法都有一个共同的缺点,就是我得用组合键,也就是我得用两个手指。我决心只用一根手指就能实现。一开始我以为只需要回复WM_CHAR消息。后来发现不太可能,因为当一个对话框里什么都没有的时候,ONCHAR事件只能被窗体接收,否则默认的消息传递是到有输入焦点的窗口。经过一番努力,我找到了两条路:
方法一。使用键盘挂钩:
简单介绍一下键盘挂钩需要的功能:
当WINDOWS调用链接的回调函数时,它将首先调用函数链开头的函数。只要我们把自己的回调函数放在链的开头,它就会先被调用。那么我们如何把自己的回调函数放在函数链的开头呢?SetWindowsHookEx()函数实现了这个功能。我们先来看看SetWindowsHookEx函数的原型:
第一个参数:指定钩子的类型,包括WH _鼠标、WH _键盘等。(详见MSDN)
第二个参数:标识钩子函数的入口地址。
第三个参数:钩子函数所在模块的句柄;
第四个参数:钩子相关函数的ID用于指定希望钩子钩住哪个线程。当它为0时,它截取整个系统的消息。
具体实现如下:
运行VS 2005构建一个MFC对话框程序,然后开始添加代码:
1.定义全局挂钩句柄:
3.调用对话框OnInitDialog()函数中的SetWindowsHookEx函数来设置键盘挂钩:
4.在对话框的析构函数中卸载钩子:
中频(hkb)
unhook windowshookex(hkb);
第二种方法更简单,即重载PreTranslateMessage函数。具体代码如下:
参考资料:
1使用键盘钩子开发按键发音程序,由GDGF,http://www.vckbase.com/document/viewdoc/? id=271
为什么WM_CHAR消息没有出现在对话框中,http://topic..net/t/20030622/19/1944358.html?
3、http://www.qqgb.com/Program/VC/VCZH/Program_54891.html对挂钩功能的初步掌握
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。