vc 熱鍵、組合鍵的用法 MFC c++ hotkey WM_HOTKEY


注冊快捷鍵 函數

BOOL WINAPI RegisterHotKey(
  __in_opt  HWND hWnd,
  __in      int id,
  __in      UINT fsModifiers,
  __in      UINT vk
);

The keys that must be pressed in combination with the key specified by the uVirtKey parameter in order to generate the WM_HOTKEY message. The fsModifiers parameter can be a combination of the following values.

 

主要使用RegisterHotKey和UnregisterHotKey兩個API函數,具體介紹請看MSDN。這里以編輯框作為示例,先建一個CEdit的派生類 CMyEdit2。

1)響應WM_HOTKEY消息

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

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

 

  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()  
  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),具體位置在:

  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()  
  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()  

 

定義響應函數:

  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. }   
  1. LONG CMyEdit2::OnHotKey(WPARAM wParam,LPARAM lParam)           
  2. {  
  3.     UINT fuModifiers = (UINT) LOWORD(lParam);  // key-modifier flags    
  4.     UINT uVirtKey = (UINT) HIWORD(lParam);     // virtual-key code    
  5.     //判斷響應了什么熱鍵   
  6.     if( MOD_CONTROL == fuModifiers && 'D' == uVirtKey )  
  7.     {  
  8.         AfxMessageBox(_T("你按下了組合鍵 ctrl + d"));    
  9.     }  
  10.     else if( MOD_ALT == fuModifiers && 'M' == uVirtKey )  
  11.     {  
  12.         AfxMessageBox(_T("你按下了組合鍵 alt + m"));    
  13.     }  
  14.     else  
  15.         AfxMessageBox(_T("你按下了未知熱鍵"));    
  16.                            
  17.     return 0;          
  18. }   

 

2)登記熱鍵

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

 

3)Unregister熱鍵

  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. }  
  1. void CMyEdit2::OnDestroy()   
  2. {  
  3.     CEdit::OnDestroy();  
  4.     //Unregister熱鍵   
  5. #ifdef _DEBUG      
  6.     int nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);   
  7.     if(!nRet)  
  8.         AfxMessageBox(_T("UnregisterHotKey 0 false"));  
  9.     nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);   
  10.     if(!nRet)  
  11.         AfxMessageBox(_T("UnregisterHotKey 1 false"));  
  12. #else   
  13.     UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);   
  14.     UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);   
  15. #endif   
  16. }  

 

 附:Init()的使用位置,這里用變量IsInit(bool值)保證Init函數只被調用一次。

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

 

【二】(使用代碼發送)發送組合鍵消息

1)發送WM_HOTKEY消息

  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);  
  1. WPARAM wParam;  
  2. LPARAM lParam;  
  3. //發送WM_HOTKEY消息,響應 ctrl + d 按鍵   
  4. wParam = 0;  
  5. lParam = MAKELONG(MOD_CONTROL,'D');  
  6. ::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM