vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY

来源:互联网 发布:留学中介知乎 编辑:程序博客网 时间:2024/05/15 23:00

一下介绍的内容均在vc6.0 MFC程序调试通过。

【一】热键的使用

主要使用RegisterHotKey和UnregisterHotKey两个API函数,具体介绍请看MSDN。这里以编辑框作为示例,先建一个CEdit的派生类 CMyEdit2。

1)响应WM_HOTKEY消息

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

  在.h文件中加入afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);  ,具体位置在:

 

view plaincopy to clipboardprint?
  1. protected:  
  2.     //{{AFX_MSG(CMyEdit2)  
  3.     afx_msg void OnDestroy();  
  4.     afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);  
  5.     //}}AFX_MSG  
  6.     afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);//手动加入  
  7.     DECLARE_MESSAGE_MAP()  

 在.cpp文件中加入ON_MESSAGE(WM_HOTKEY,OnHotKey),具体位置在:

view plaincopy to clipboardprint?
  1. BEGIN_MESSAGE_MAP(CMyEdit2, CEdit)  
  2.     //{{AFX_MSG_MAP(CMyEdit2)  
  3.     ON_WM_CHAR()  
  4.     ON_WM_DESTROY()  
  5.     ON_WM_CREATE()  
  6.     //}}AFX_MSG_MAP  
  7.     ON_MESSAGE(WM_HOTKEY,OnHotKey) //手动加入  
  8. END_MESSAGE_MAP()  

定义响应函数:

view plaincopy to clipboardprint?
  1. LONG CMyEdit2::OnHotKey(WPARAM wParam,LPARAM lParam)           
  2. {  
  3.   
  4.     UINT fuModifiers = (UINT) LOWORD(lParam);  // key-modifier flags   
  5.     UINT uVirtKey = (UINT) HIWORD(lParam);     // virtual-key code   
  6.   
  7.     //判断响应了什么热键  
  8.     if( MOD_CONTROL == fuModifiers && 'D' == uVirtKey )  
  9.     {  
  10.         AfxMessageBox(_T("你按下了组合键 ctrl + d"));    
  11.     }  
  12.     else if( MOD_ALT == fuModifiers && 'M' == uVirtKey )  
  13.     {  
  14.         AfxMessageBox(_T("你按下了组合键 alt + m"));    
  15.     }  
  16.     else  
  17.         AfxMessageBox(_T("你按下了未知热键"));    
  18.                            
  19.     return 0;          
  20. }   

2)登记热键

view plaincopy to clipboardprint?
  1. void CMyEdit2::Init()  
  2. {  
  3. //此函数可以在PreSubclassWindow和OnCreate中使用;  
  4. //如果不在前两者中使用,可以到放到CDialog::OnInitDialog或者  
  5. //CView::OnInitialUpdate函数中使用  
  6.   
  7.     ASSERT(NULL != GetSafeHwnd());  
  8.   
  9.     //Register热键  
  10. #ifdef _DEBUG //debug版本  
  11.     int nRet = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D'); //热键 ctrl + d  
  12.     if(!nRet)  
  13.         AfxMessageBox(_T("RegisterHotKey 0 false"));  
  14.     nRet = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[1],MOD_ALT,'M'); //热键 alt + m  
  15.     if(!nRet)  
  16.         AfxMessageBox(_T("RegisterHotKey 1 false"));  
  17. #else //release版本  
  18.     RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D'); //热键 ctrl + d  
  19.     RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[1],MOD_ALT,'M'); //热键 alt + m  
  20. #endif  
  21. }  

3)Unregister热键

view plaincopy to clipboardprint?
  1. void CMyEdit2::OnDestroy()   
  2. {  
  3.     CEdit::OnDestroy();  
  4.   
  5.     //Unregister热键  
  6. #ifdef _DEBUG     
  7.     int nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);   
  8.     if(!nRet)  
  9.         AfxMessageBox(_T("UnregisterHotKey 0 false"));  
  10.     nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);   
  11.     if(!nRet)  
  12.         AfxMessageBox(_T("UnregisterHotKey 1 false"));  
  13. #else  
  14.     UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);   
  15.     UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);   
  16. #endif  
  17.   
  18. }  

 附:Init()的使用位置,这里用变量IsInit(bool值)保证Init函数只被调用一次。

view plaincopy to clipboardprint?
  1. void CMyEdit2::PreSubclassWindow()   
  2. {  
  3.     //初始化  
  4.     if( !IsInit )  
  5.     {  
  6.         Init();  
  7.         IsInit = true;  
  8.     }  
  9.       
  10.     CEdit::PreSubclassWindow();  
  11. }  
  12.   
  13. int CMyEdit2::OnCreate(LPCREATESTRUCT lpCreateStruct)   
  14. {  
  15.     if (CEdit::OnCreate(lpCreateStruct) == -1)  
  16.         return -1;  
  17.       
  18.     //初始化  
  19.     if( !IsInit )  
  20.     {  
  21.         Init();  
  22.         IsInit = true;  
  23.     }  
  24.       
  25.     return 0;  
  26. }  

【二】(使用代码发送)发送组合键消息

1)发送WM_HOTKEY消息

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