0、测试环境

VS2015专业版,基于对话框的MFC程序,

例子地址:http://pan.baidu.com/s/1qX9IRec

1、MFC工程设置

类向导->消息->WM_HOTKEY->添加处理程序->确定或编辑代码

执行后MFC工程会生成下面的代码

//-------------------MFC_TESTDlg.h

afx_msg void OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2); //声明消息处理函数

//-------------------MFC_TESTDlg.cpp
ON_WM_HOTKEY() //消息映射宏,绑定消息与相应处理函数 void CMFC_TESTDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2) //实现消息处理函数
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}

2、添加热键注册/取消代码

2.1、热键注册/取消API

//Defines a system-wide hot key.
BOOL WINAPI RegisterHotKey(//https://msdn.microsoft.com/en-us/library/ms646309(v=vs.85).aspx
_In_opt_ HWND hWnd, //接收热键触发事件的窗口句柄
_In_ int id, //热键的ID,应用程序ID范围 [0x0000,0xBFFF].DLL范围[0xC000~0xFFFF]
_In_ UINT fsModifiers, //声明组合键中的 Alt(MOD_ALT)、Ctrl(MOD_CONTROL)、Shift(MOD_SHIFT)、Win键(MOD_WIN)、MOD_NOREPEAT 或者其组合
_In_ UINT vk //普通按键的代码(例如'A'),其他见https://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx
); //Frees a hot key previously registered by the calling thread.
BOOL WINAPI UnregisterHotKey(//https://msdn.microsoft.com/en-us/library/ms646327(v=vs.85).aspx
_In_opt_ HWND hWnd, //接收热键触发事件的窗口句柄
_In_ int id //热键的ID 

2.2、API使用举例

热键的注册可以放在OnInitDialog()函数或者WM_CREATE事件处理函数中,取消注册可以放在WM_DESTROY事件处理函数中。

//WM_CREATE Event Proc Handler
int CMFC_TESTDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -)
return -; // TODO: 在此添加您专用的创建代码
//注册热键 Ctrl + S(s)
RegisterHotKey(this->GetSafeHwnd(), , MOD_CONTROL, 'S');
RegisterHotKey(this->GetSafeHwnd(), , MOD_CONTROL, 's');
//注册热键 Ctrl + F1(不重复,不会连续收到多次)
RegisterHotKey(this->GetSafeHwnd(), , MOD_CONTROL | MOD_NOREPEAT, VK_F1);
return ;
} //WM_DESTROY Event Proc Handler
void CMFC_TESTDlg::OnDestroy()
{
CDialogEx::OnDestroy(); // TODO: 在此处添加消息处理程序代码
//解除热键注册
UnregisterHotKey(this->GetSafeHwnd(), );
UnregisterHotKey(this->GetSafeHwnd(), );
UnregisterHotKey(this->GetSafeHwnd(), );
}

3、修改热键处理函数

void CMFC_TESTDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nHotKeyId) {
case :
case :
//proc Ctrl + S here
break;
case :
//proc Ctrl + F1 here
break; default:
break;
} CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}

----------------------------------------------

参考资料:

http://blog.csdn.net/wangjieest/article/details/6910166

MSDN

最新文章

  1. FPGA优化之高扇出
  2. nodeJS常用的定时执行任务的插件
  3. 微信分享ios设备没有分享图标安卓有分享图标 (分享功能没有问题)
  4. C#类继承和接口继承时一些模棱两可的问题[转]
  5. [转载]TableView详解
  6. 朝花夕拾-android 从手机选择图片或拍照设置头像
  7. UESTC 886 方老师金币堆 --合并石子DP
  8. dom select选单
  9. js学习笔记之:键盘应用
  10. [Leetcode][020] Valid Parentheses (Java)
  11. Codeforces 229D Towers
  12. codecomb 2098【stone】
  13. lab4 Cache Geometries 深入理解计算机系统——高速缓存
  14. hdu1381 Crazy Search(hash map)
  15. Cygwin 各种情况下中文乱码--终极解决方案
  16. ADO.NET 数据访问类查询、属性扩展
  17. 可变数目参数----关键字params的使用
  18. python-操作文件和目录
  19. JavaScript代码组织结构良好的5个特点
  20. Objective-C与Swift混编

热门文章

  1. 盒模型的垂直居中css
  2. SQL随记(五)——函数篇
  3. ansible安装二进制kubernetes-1.14.1
  4. 关于snmp octet string和普通string问题
  5. netcore项目在Windows部署:使用NSSM部署Windows服务
  6. sql0001
  7. Java虚拟机—垃圾回收算法(整理版)
  8. addEventListener解决多个window.onscroll共存的2个方法
  9. Centos7.2正常启动关闭CDH5.16.1
  10. docker部署redis及踩到的坑