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

相關文章
相關標籤/搜索