zoukankan      html  css  js  c++  java
  • 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);  
  • 相关阅读:
    使用Navicat for Oracle工具连接oracle
    ArcGIS中的坐标系统定义与投影转换(转)
    随鼠标移动在状态栏实时显示地图坐标(转载)
    SQL Server 2014 中废止的数据库引擎功能
    sql server 对已有数据的表,添加核查约束 [失败],请使用with nocheck 子句
    一次性预览多张图片时遇到的问题
    vue中注册多个全局过滤器
    关于vue-cli本地项目启动,手机端无法访问题(有可能是360安全卫士作的妖)
    关于vuex中mapActions传参小tips
    javaScript知识梳理String篇
  • 原文地址:https://www.cnblogs.com/sitemaker/p/2599873.html
Copyright © 2011-2022 走看看