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

MFC-注册热键的更多相关文章

  1. MFC注册热键

    注册热键. 当用户点击注册的快捷键时,做出相应的响应. 定义 ALT+M键为测量按钮响应函数: 头文件中定义: #define ID_HOTKEY1 10001 在初始化函数中加入注册热键函数: if ...

  2. RegisterHotKey注册热键,然后响应WM_HOTKEY消息

    MSDN中的一个示例代码,步骤就是RegisterHotKey注册热键,然后响应WM_HOTKEY消息 @1:这个是系统热键 #include "stdafx.h" int _cd ...

  3. delphi注册热键方法(一)

    uses windows,menus; ..... //声明 HotKey_Key: Word; HotKey_Shift: Word; procedure WMHotKey(var msg : Tm ...

  4. 【WinForm程序】注册热键快捷键切换

    重写DefWndProc事件 #region Window 消息捕获 const int WM_COPYDATA = 0x004A; public struct COPYDATASTRUCT { pu ...

  5. WPF注册热键后处理热键消息(非winform方式)

    由于最近在做wpf版的截图软件,在处理全局热键的时候,发现国内博客使用的都是winform窗体的键盘处理方式,此方式需要使用winform的动态库,如此不协调的代码让我开始在github中寻找相关代码 ...

  6. WinForm和WPF中注册热键

    由于.Net没有提供专门的类库处理热键,所以需要直接调用windows API来解决. HotKey为.NET调用Windows API的封装代码,主要是RegisterHotKey和Unregist ...

  7. qt 注册热键

    原文 将所需的库添加到您的qmake项目(.PRO文件) LIBS += \ -lUser32 2.在代码中包含所需的头文件. #include <windows.h> 在程序开始时注册热 ...

  8. MFC 给对话框注册热键

    在头文件中添加: //}}AFX_MSGafx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);//(此行为加入的)BEGIN_MESSAGE_MA ...

  9. MFC注册窗口类以及FindWindow按窗口类名查询

    很多玩游戏的人都知道一般游戏客户端程序是不允许双开的,就是说在同一游戏在启动的时候,是无法打开多个窗口.很多其他软件如酷狗播放器等也是这样.如果把打开的窗口最小化,这时重新启动程序,最小化的窗口会被显 ...

  10. MFC注册表操作

    注册表简介 有时程序中要存些设置信息,一个方法就是创建一些普通的txt或xml文件,然后保存进去就行了.另一办法就是保存到注册表里.注册表是由windows维护的一个小数据库.里面也会保存window ...

随机推荐

  1. java线程池与五种常用线程池策略使用与解析

    背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQu ...

  2. (八)控件介绍,QLable

    Radio单选框 默认互斥,加GroupBox进行分组可以解决这个 checkBox复选 ListWidget TableWIdget:有表头 #include "widget.h" ...

  3. Vue-route实现原理

    1.原理图如下所示 2.说明 1.安装插件的时候监听hashchange事件,监视_route 2.处理router-link 获取到path关联组件 3.等待hashchange触发,匹配route ...

  4. Matlab安装完成后,出现错误licensing error:-8523的解决方法

    Matlab2018安装成功后,打开出现licensing error:-8523解决方法 https://blog.csdn.net/qq_41634276/article/details/8000 ...

  5. thinkphp5 去除缓存

    array_map('unlink', glob(TEMP_PATH . '/*.php')); rmdir(TEMP_PATH);

  6. JN_0008:win下通过cmd进入指定目录

    1,WIN+R,调出运行命令窗口,并输入CMD,回车确认运行 2,先进入盘符,如:    d: 3,再进入盘符下的指定目录,如:    cd test 4,一次性进入指定目录(要用到  /d 命令): ...

  7. React Router 4.x 开发,这些雷区我们都帮你踩过了

    前言 在前端框架层出不穷的今天,React 以其虚拟 DOM .组件化开发思想等特性迅速占据了主流位置,成为前端开发工程师热衷的 Javascript 库.作为 React 体系中的重要组成部分:Re ...

  8. 内网环境上部署k8s+docker集群:集群ftp的yum源配置

    接触docker已经有一年了,想把做的时候的一些知识分享给大家. 因为公司机房是内网环境无法连接外网,所以这里所有的部署都是基于内网环境进行的. 首先,需要通过ftp服务制作本地的yum源,可以从ht ...

  9. 关于ElementUI中MessageBox弹框的取消键盘触发事件(enter,esc)关闭弹窗(执行事件)的解决方法

    好久没见了 在项目中遇到一个小小的需求,总结了一下! 详细我就不介绍了,相信大家用过的话,很了解.详见文档-----------> http://element-cn.eleme.io/#/zh ...

  10. 安装版本( 相关关系 Vue SSR 指定版本)

    1. 关于 brew mac包管理器 终端安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebr ...