MFC-注冊熱鍵


0、測試環境

VS2015專業版,基於對話框的MFC程序,

例子地址:http://pan.baidu.com/s/1qX9IRec

1、MFC工程設置

類向導->消息->WM_HOTKEY->添加處理程序->確定或編輯代碼

執行后MFC工程會生成下面的代碼

//-------------------MFC_TESTDlg.h

afx_msg void OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2); //聲明消息處理函數


//-------------------MFC_TESTDlg.cpp
ON_WM_HOTKEY()        //消息映射宏,綁定消息與相應處理函數

void CMFC_TESTDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2) //實現消息處理函數
{
    // TODO: 在此添加消息處理程序代碼和/或調用默認值

    CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}

2、添加熱鍵注冊/取消代碼

2.1、熱鍵注冊/取消API

//Defines a system-wide hot key.
BOOL WINAPI RegisterHotKey(//https://msdn.microsoft.com/en-us/library/ms646309(v=vs.85).aspx
  _In_opt_ HWND hWnd,            //接收熱鍵觸發事件的窗口句柄
  _In_     int  id,                //熱鍵的ID,應用程序ID范圍 [0x0000,0xBFFF].DLL范圍[0xC000~0xFFFF]
  _In_     UINT fsModifiers,    //聲明組合鍵中的 Alt(MOD_ALT)、Ctrl(MOD_CONTROL)、Shift(MOD_SHIFT)、Win鍵(MOD_WIN)、MOD_NOREPEAT 或者其組合
  _In_     UINT vk                //普通按鍵的代碼(例如'A'),其他見https://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx
);

//Frees a hot key previously registered by the calling thread.
BOOL WINAPI UnregisterHotKey(//https://msdn.microsoft.com/en-us/library/ms646327(v=vs.85).aspx
  _In_opt_ HWND hWnd,            //接收熱鍵觸發事件的窗口句柄
  _In_     int  id                //熱鍵的ID 

2.2、API使用舉例

熱鍵的注冊可以放在OnInitDialog()函數或者WM_CREATE事件處理函數中,取消注冊可以放在WM_DESTROY事件處理函數中。

//WM_CREATE Event Proc Handler
int CMFC_TESTDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialogEx::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  在此添加您專用的創建代碼
    //注冊熱鍵 Ctrl + S(s)
    RegisterHotKey(this->GetSafeHwnd(), 1001, MOD_CONTROL, 'S');
    RegisterHotKey(this->GetSafeHwnd(), 1002, MOD_CONTROL, 's');
    //注冊熱鍵 Ctrl + F1(不重復,不會連續收到多次)
    RegisterHotKey(this->GetSafeHwnd(), 1003, MOD_CONTROL | MOD_NOREPEAT, VK_F1);
    return 0;
}

//WM_DESTROY Event Proc Handler
void CMFC_TESTDlg::OnDestroy()
{
    CDialogEx::OnDestroy();

    // TODO: 在此處添加消息處理程序代碼
    //解除熱鍵注冊
    UnregisterHotKey(this->GetSafeHwnd(), 1001);
    UnregisterHotKey(this->GetSafeHwnd(), 1002);
    UnregisterHotKey(this->GetSafeHwnd(), 1003);
}

3、修改熱鍵處理函數

void CMFC_TESTDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
    // TODO: 在此添加消息處理程序代碼和/或調用默認值
    switch (nHotKeyId) {
    case 1001:
    case 1002:
        //proc Ctrl + S here
        break;
    case 1003:
        //proc Ctrl + F1 here
        break;

    default:
        break;
    }

    CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}

 

 

----------------------------------------------

參考資料:

http://blog.csdn.net/wangjieest/article/details/6910166

MSDN

 


免責聲明!

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



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