自定义热键

来源:互联网 发布:中国人的基因图谱 知乎 编辑:程序博客网 时间:2024/04/28 13:45

1、对话框OnInitDialog()函数中加入:
               ::RegisterHotKey(m_hWnd,200,MOD_CONTROL,'Z');

2、BEGIN_MESSAGE_MAP(CTestDlgCDialog)
               
//{{AFX_MSG_MAP(CTestDlg)
                ON_MESSAGE(WM_HOTKEY,OnHotKey)
               
//}}AFX_MSG_MAP
       END_MESSAGE_MAP()

3、添加成员函数:

void CMy1Dlg::OnHotKey(WPARAM wp, LPARAM lp)
{
if(wp==200)
{
  AfxMessageBox("Ctrl+Z");
}
}

4、重载
DestroyWindow()
::UnregisterHotKey(m_hWnd,200);

***************************************************************************************

如何自定义组合键

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

    [解决方法]
      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+D的快捷键组合功能.在调用该函数后你的进程会在ALT+D按下时比系统先得到通知.你需要处理的消息是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");

       if(wParam == m_nHotKeyID)//多个热键时使用

{

}
           //加入相关代码.
           return 0;
      }

0 0