热键注册与注销

时间:2022-11-18 22:31:58

热键注册与注销两个API函数:1.RegisterHotKey(注册热键)

                                                       2.UnregisterHotKey(反注册热键)

一、注册RegisterHotKey

        1.函数原型如下

       BOOL RegisterHotKey(

                HWND hWnd,         // handle to window

                int id,              // hot key identifier

                UINT fsModifiers,  // key-modifier options

                UINT vk             // virtual-key code

);

说明:

第一个参数指定接收WM_HOTKEY消息的窗体句柄

第二个参数热键标识,代表这个热键的唯一ID,应用程序中的标识值在0x0000和0xbfff之间,DLL中的在0xc000和0xffff之间

第三个参数 指的是附加按键的修改,比如说你按住了CTRL键,这里的值可以选择MOD_ALT,MOD_CONTROL,MOD_SHIFT,MOD_WIN,MOD_KEYUP

第四个参数指的是按键的虚拟码 (比如,F7的是118)

二、UnregisterHotKey

        1.函数原型如下   

BOOL UnregisterHotKey(
HWND
hWnd, // handle to window

int id // hot key identifier
);
说明:
第一个参数是说明你要注销哪个窗口句柄的热键
第二个参数说明是你开始注册的唯一ID

三、使用RegisterHotKey

       1.    RegisterHotKey可以向窗口发送WM_HOTKEY消息,所以先定义WM_HOTKEY消息映射。

              在.h文件中加入:

                                  afx_msg voidOnHotKey(WPARAM wParam,LPARAM lParam);//手动加入     

              在.cpp文件中加入:

                                 ON_MESSAGE(WM_HOTKEY,OnHotKey)

       2.登记热键

 BOOL CMyDlg::RegisterHotKey()
{
  WPARAM   m_wVirtualKeyCode = 118;//即F7的虚拟码
   LPARAM  m_wModifiers =0;
   
    UINT fsModifiers = 0;
    if (m_wModifiers & HOTKEYF_ALT)
    {
        fsModifiers |= MOD_ALT;//加上ALT键
    }
    if (m_wModifiers & HOTKEYF_CONTROL)
    {
        fsModifiers |= MOD_CONTROL;
    }
    if (m_wModifiers & HOTKEYF_SHIFT)
    {
        fsModifiers |= MOD_SHIFT;
    } 

 

      //int ret = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D');

//HOTKEYID  为自定义的 #define HOTKEYID 0x2FED
    
    if(!::RegisterHotKey(GetSafeHwnd(),HOTKEYID, fsModifiers, m_wVirtualKeyCode)) //第四个参数可以直接写“F7”,如上
    {
        MessageBox( "注册系统热键失败! ");
        return   FALSE;
    }
   
    return TRUE;
}

     3.热键响应函数

void CMyDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
    /////////////////////////////////////

   //你的操作

}

四、使用UnregisterHotKey

void     ****::OnDestroy()   

{  

 //Unregister热键   

#ifdef _DEBUG     

  int nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);   

  if(!nRet)  

AfxMessageBox(_T("UnregisterHotKey 0 false"));  

 nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);   

if(!nRet)  

 AfxMessageBox(_T("UnregisterHotKey 1 false"));  

#else   

  UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);   

  UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);   

#endif   

  

}  

 

五、(使用代码发送)发送组合键消息

1)发送WM_HOTKEY消息

[cpp]             WPARAM wParam;  
  1. LPARAM lParam;  
  2.   
  3. //发送WM_HOTKEY消息,响应 ctrl + d 按键  
  4. wParam = 0;  
  5. lParam = MAKELONG(MOD_CONTROL,'D');  
  6. ::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);