hot key用法1

转自:http://blog.csdn.net/hityct1/article/details/3853666
vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY收藏
2009-02-22 19:26

一下介绍的内容均在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); ,具体位置在:

  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. 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)登记热键

  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   

 

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. }

附: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;   

 

 

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

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


注:如果需要实现非组合键的快捷键,可以将 RegisterHotKey第三个参数设置为NULL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值