VC如何注册、屏蔽全局键盘热键

 VC如何注册、屏蔽全局键盘热键

一、定义按键消息热键的宏,后续可自行添加更多 less

/************************************************************************/  
// VirtualKey.H     By:Koma 2009.08.22  
// 定义热键  
// http://blog.csdn.net/wangningyu  
  
/************************************************************************/  
/* Ctrl组合键 (D、F二、F八、F九、F十、F十一、F12              共6个) 
/************************************************************************/  
#define IDH_HOT1        4001  
#define IDH_HOT2        4002  
#define IDH_HOT3        4003  
#define IDH_HOT4        4004  
#define IDH_HOT5        4005  
#define IDH_HOT6        4006  
#define IDH_HOT19       4019  
  
/************************************************************************/  
/* Alt组合键 (F一、F四、F9                             共3个) 
/************************************************************************/  
#define IDH_HOT7        4007  
#define IDH_HOT8        4008  
#define IDH_HOT9        4009  
  
/************************************************************************/

二、注册全局的热键,从而实现屏蔽热键 函数

/************************************************************************/    
/* 函数说明:MFC初始化函数,用来注册全局热键                                        
/* 参    数:无                                    
/* 返 回 值:成功返回TRUE、失败返回FALSE     
/* By:Koma   2009.07.30 17:50                                 
/************************************************************************/   
BOOL CHookKBDlg::OnInitDialog()  
{  
    CDialog::OnInitDialog();  
    // 若是须要添加其余的组合键,须要在VirtualKey.h添加记录  
    // 在OnInitDialog、PreTranslateMessage中各添加一行代码便可  
  
    // Ctrl组合键 (D、F二、F八、F九、F十、F十一、F12              共7个)  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT1, MOD_CONTROL, VK_F2);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT2, MOD_CONTROL, VK_F8);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT3, MOD_CONTROL, VK_F9);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT4, MOD_CONTROL, VK_F10);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT5, MOD_CONTROL, VK_F11);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT6, MOD_CONTROL, VK_F12);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT19, MOD_CONTROL, 'D');  
  
    // Alt组合键 (F一、F四、F9                             共3个)  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT7, MOD_ALT, VK_F1);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT8, MOD_ALT, VK_F4);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT9, MOD_ALT, VK_F9);  
  
    return TRUE;  // return TRUE  unless you set the focus to a control  
}

三、有点像"占着茅坑不拉S”,直接过滤掉此消息... this

/************************************************************************/    
/* 函数说明:MFC虚函数,用来屏蔽热键                                        
/* 参    数:无                                    
/* 返 回 值:屏蔽返回TRUE、不屏蔽返回FALSE     
/* By:Koma   2009.07.30 17:50                                 
/************************************************************************/    
BOOL CHookKBDlg::PreTranslateMessage(MSG* pMsg)   
{  
    // TODO: Add your specialized code here and/or call the base class  
    if(pMsg->message==WM_HOTKEY)    
    {     
        switch(pMsg->wParam)  
        {  
        case IDH_HOT1:  
        case IDH_HOT2:  
        case IDH_HOT3:  
        case IDH_HOT4:  
        case IDH_HOT5:  
        case IDH_HOT6:  
        case IDH_HOT7:  
        case IDH_HOT8:  
        case IDH_HOT9:  
            // MessageBox(_T("此类组合键严禁使用!"));  
            // true 标示处理过此消息再也不投递到消息队列,  
            SetDlgItemText(IDC_STATIC1,"别按了,没用的!");  
            return TRUE;  
        }  
    }     
    return CDialog::PreTranslateMessage(pMsg);  
}
注意:   取消注册热键用 UnregisterHotKey(......)

 ------------------------------------------ spa

MFC 热键设置 OnHotKey方法和Accelerator方法的设置

在写MFC程序时,若是想自定义热键好比ALT+S能够采用下面两种方法:

方法一:定义热键的消息响应函数:OnHotKey
定义系统全局热键:

一、首先在.h文件中添加消息响应函数声明
  afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
二、关联消息及响应函数
      BEGIN_MESSAGE_MAP()
   ON_MESSAGE(WM_HOTKEY,OnHotKey)
END_MESSAGE_MAP()

三、在初始化函数里注册热键
RegisterHotKey(m_hWnd,ID_HOTKEY,MOD_ALT,‘s’);  
// ID_HOTKEY是本身定义的一个ID宏
‘s'能够写成ASCII码

四、在消息响应函数里添加操做
LRESULT  CMyTest::OnHotKey(WPARAM wParam,LPARAM lParam) 
 { 
 UINT Mod = (UINT) LOWORD(lParam); // key-modifier flags 
 UINT uVirtKey = (UINT) HIWORD(lParam); // virtual-key code 
 //判断响应了什么热键 
 if( MOD_CONTROL ==  Mod  && ‘s’ == uVirtKey ) 
 { 
 AfxMessageBox(_T("你按下了组合键 ALT+ S"));
 } 
 else 
 AfxMessageBox(_T("你按下了未知热键")); 
 return 0; 
 }
 

方法二: 
Accelerator方法 只在本应用程序内有效
http://support.microsoft.com/?kbid=222829  
一、插入一个新的Accelerator到资源里,把加速键和对应的响应控件(如一个按钮)关联 
二、在对话框头文件中声明: 
     HACCEL   m_hAccel; 
三、在对话框的构造函数里初始化m_hAccel 
    m_hAccel   =   ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1)); 
四、而后重载对话框的PreTranslateMessage函数,在 
BOOL   CAboutDlg::PreTranslateMessage(MSG*   pMsg)   

      if   (m_hAccel)   
      { 
            if   (::TranslateAccelerator(m_hWnd,   m_hAccel,   pMsg))   
            { 
                  return(TRUE); 
            } 
      } 
      return   CDialog::PreTranslateMessage(pMsg); 


而后重载 OnCommand();函数;
BOOL CFreeChatDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (ID_ALT_S == LOWORD(wParam))//ID_ALT_S是在 Accelerator中注册快捷键的ID
{
//加入响应的快捷键的操做
}
return CDialog::OnCommand(wParam,lParam);
}


但愿能帮你少走点弯路^^

注意:   取消注册热键用 UnregisterHotKey(......) .net

相关文章
相关标签/搜索