[问题提出]
     有的程序需要自定义组合键完成一定功能,如何实现?

[解决方法]
     RegisterHotKey函数原型及说明:
     BOOL RegisterHotKey(
     HWND hWnd,                     // 接收WM_HOTKEY的窗口句柄
     int id,                        // hot key的ID号.
     UINT fsModifiers,              // 响应那个热键.
     UINT vk                        // 与热键配合的键.

其中:
       1)id的说明:
       id为你自己定义的一个ID值,对一个线程来讲其值必需在0x0000 - 0xBFFF范围之内,对DLL来讲其值必需在0xC000 - 0xFFFF 范围之内,在同一进程内该值必须唯一

2)fsModifiers的取值如下:
         .MOD_ALT
         .MOD_CONTROL
         .MOD_SHIFT
         .MOD_WIN

[程序实现]
     建立名为My的对话框工程.本例要用到RegisterHotKey()实现Alt+E的快捷键组合功能.在调用该函数后你的进程会在ALT+E按下时比系统先得到通知.你需要处理的消息是WM_HOTKEY.
     如下:

在MyDlg.h中:
     class CMyDlg : public CDialog
     {
          // Construction
          public:
              int m_nHotKeyID;//为你自己定义的一个hot key的ID值,在整个程序唯一.
          ........
          protected:
              HICON m_hIcon;

// Generated message map functions
          //{{AFX_MSG(CMyDlg)
          virtual BOOL OnInitDialog();
          afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
          afx_msg void OnPaint();
          afx_msg HCURSOR OnQueryDragIcon();
          afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);//手动加入.
          //}}AFX_MSG   
          DECLARE_MESSAGE_MAP()
     };
    
     在MyDlg.cpp中:
     #define VK_D 68

..............
     BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
          //{{AFX_MSG_MAP(CHotKey1Dlg)
          ON_WM_SYSCOMMAND()
          ON_WM_PAINT()
          ON_WM_QUERYDRAGICON()
          ON_BN_CLICKED(IDOK, OnRegisterHotKey)
          ON_BN_CLICKED(IDCANCEL, OnUnregisterHotKey)
          ON_MESSAGE(WM_HOTKEY,OnHotKey)                      //手动加入.
          //}}AFX_MSG_MAP
     END_MESSAGE_MAP()

BOOL CMyDlg::OnInitDialog()
     {
          CDialog::OnInitDialog();

// Add "About..." menu item to system menu.
          m_nHotKeyID=0;
          BOOL m_isKeyRegistered =RegisterHotKey(GetSafeHwnd(),m_nHotKeyID,MOD_ALT,VK_D);
          ASSERT(m_isKeyRegistered != FALSE);
          return TRUE;   // return TRUE   unless you set the focus to a control
     }
    
     在取消按钮的事件函数中加入:
     void CMyDlg::OnCancel()
     {
          BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
          ASSERT(m_iskeyUnregistered != FALSE);
          CDialog::OnCancel();
     }

处理截到的组合键,并处理:
     LONG CMyDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
     { 
          AfxMessageBox("你按下了组合键:Alt+D");
          //加入相关代码.
          return 0;
     }

MFC程序添加快捷键的更多相关文章

  1. 给基于对话框的MFC程序添加状态栏并实时显示时间

    转载自丝雪儿 1.首先在string table 里添加两个字串,ID分别为IDS_INDICATOR_MESSAGE and IDS_INDICATOR_TIME 2.在你的 dlg.h 类里面加个 ...

  2. 图文详解MFC程序设置菜单快捷键

    原来觉得添加个快捷键就只要几分钟,上网搜索文章都写得很模糊, 只有这边文章不错. http://www.cplusplus.me/1263.html http://blog.sina.com.cn/s ...

  3. MFC程序显示控制台输出

    有的时候,我们用c写的一些东西,可能需要MFC作为UI输入参数进行测试,但是程序里有大量的printf操作,这就需要MFC程序启动的时候同时打开 一个控制台,用于标准输出 查询网络,大致方法有以下两种 ...

  4. 如何给MFC的菜单项添加快捷键

    我们一起分享,如何给MFC的菜单项添加快捷键.[程序在VC6.0编译环境下编译通过.(VS2010的编译环境大同小异)] 1.程序演示环境 1.1新建一个[对话框(Dialog)]的程序.然后,New ...

  5. Mac添加快捷键开启应用程序(转)

    最近使用终端比较多点,打开终端的方法有几种:比较常用有把终端添加到Dock栏上,然后就是利用Spotlight搜索Terminal来打开.但是两种方式还是让我感觉不太满意. 当开启的程序比较多的时候, ...

  6. 如何在VS2010的VC++ 基于对话框的MFC程序中添加菜单

    方法1:亲测 成功  转载自https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/48338f6b-e5d9-4c0c-8b17-05ca3ef ...

  7. C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)

    一.什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的“ ...

  8. vs2010的“应用程序向导”新建MFC程序报错“当前页面的脚本发送错误”

    原创文章,欢迎阅读,禁止转载. 问题现象不知道从什么时候开始,我的vs2010不能新建MFC程序了,报错如图:... 解决方法根据提示排查,发现是应用程序向导的相关html被损坏了.从同事电脑上把   ...

  9. MFC如何添加系统消息处理函数?

    http://zhidao.baidu.com/question/318026804.html 在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成 ...

随机推荐

  1. openstack封装镜像

    1.准备工作:准备你想要封装的各种镜像的iso,完整版本最简单版本都ok,只要能出虚拟机就行,这个大家去官网下载自己要的iso就可以,我这里用centos6.4最简版本,因为分给我的活让做这个的... ...

  2. RTC驱动程序分析

    drivers\rtc\rtc-s3c.c s3c_rtc_init      platform_driver_register            s3c_rtc_probe           ...

  3. Hadoop Shell 介绍

    以 hadoop 2.7.3 为例 bin 目录下是最基础的集群管理脚本, 用户可通过该脚本完成各种功能, 如 HDFS 管理, MapReduce 作业管理等. 作为入门, 先介绍bin 目录下的 ...

  4. Flutter实战视频-移动电商-55.购物车_底部结算栏UI制作

    55.购物车_底部结算栏UI制作 主要做下面结算这一栏目 cart_bottom.dart页面 先设置下内边距 拆分成三个子元素 全选 因为有一个文本框和一个全选的text文本,所以这里也用了Row布 ...

  5. UVa 11520 Fill the Square (水题,暴力)

    题意:给n*n的格子里填上A-Z的字符,保证相邻字符不同,并且字典序最小. 析:直接从第一个格子开始暴力即可,每次判断上下左是不是相同即可. 代码如下: #pragma comment(linker, ...

  6. Linux whereis 搜索命令位置

    在学习 兄弟连 linux教学视频 的时候,我将所学的 linux 命令记录在我的博客中,方便自己查阅. 文件搜索命令: whereis 基础的命令 命令名称:whereis 命令的所在路径:/usr ...

  7. HDU5997 【线段树】

    思路: 用vector存一下各种颜色的区间,每次处理颜色的区间,相同颜色不需要更新.区间最多1e6个没错,但是随着颜色的更替区间只会越来越少. 维护区间左右两端的颜色,lazy一下. 区间合并的时候 ...

  8. Tarjan找桥和割点与点连通分量与边连通分量【未成形】

    之前只学了个强连通Tarjan算法,然后又摸了缩点操作: 然后今天在lightoj摸了一道模板题,是求所有桥的题: 然后发现,要把:割点,割点集合,双连通,最小割边集合(桥),点连通分量,边连通分量都 ...

  9. shader实例(二十二)TexGen-球面贴图SphereMap

    http://blog.sina.com.cn/s/blog_89d90b7c0102vfqz.html 球面贴图一般用于环境反射,如下图(左边为球面贴图,右边为正常贴图),一个镜面水晶球在这只猫的前 ...

  10. CentOS 利用 yum 安装卸载软件常用命令

    一.yum安装和卸载软件 有个前提是yum安装的软件包都是rpm格式的. 安装的命令是,yum install ~,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突, ...