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

[解决方法]
     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;
     }

最新文章

  1. Java jvisualvm简要说明
  2. 【转】Weblogic的集群
  3. Android官方数据绑定框架DataBinding
  4. sql server 清空数据库表数据
  5. About 'atoi'
  6. Android中的windowSoftInputMode属性详解
  7. Swift伟大的编程语言数据采集
  8. vmware卸载问题
  9. 基于NIOS-II的示波器:PART2 界面动态显示功能
  10. 阿里云centos 搭建SVN
  11. jsp学习笔记之:内置对象
  12. 使用JavaScript动态的添加组件
  13. MySQL varchar类型数据转tinyint类型
  14. 程序设计第三次作业---C++计算器雏形
  15. JSON parse error: Cannot deserialize instance of `int` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc
  16. CentOS之文档的压缩与打包
  17. Executor简析
  18. Java中classpath配置
  19. 【英宝通Unity4.0公开课学习 】(五)47讲到75讲
  20. 使用Dockerfile定制镜像

热门文章

  1. 经典分析--HTTP协议
  2. Storm并行度详解
  3. vuex本地存储
  4. Android开发相关工具(eclipse篇)
  5. 【eclipse插件开发实战】Eclipse插件开发7——插件发布jar包
  6. JAVA实现DIJKSTRA算法
  7. Fitnesse中TemplateLibrary的使用方法
  8. F#周报2019年第20期
  9. 线性SVM与Softmax分类器
  10. PhpStorm插件之CodeGlance