一下介紹的內容均在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); ,具體位置在:
protected:<br />//{{AFX_MSG(CMyEdit2)<br />afx_msg void OnDestroy();<br />afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);<br />//}}AFX_MSG<br />afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);//手動加入<br />DECLARE_MESSAGE_MAP()
在.cpp檔案中加入ON_MESSAGE(WM_HOTKEY,OnHotKey),具體位置在:
BEGIN_MESSAGE_MAP(CMyEdit2, CEdit)<br />//{{AFX_MSG_MAP(CMyEdit2)<br />ON_WM_CHAR()<br />ON_WM_DESTROY()<br />ON_WM_CREATE()<br />//}}AFX_MSG_MAP<br />ON_MESSAGE(WM_HOTKEY,OnHotKey) //手動加入<br />END_MESSAGE_MAP()
定義響應函數:
LONG CMyEdit2::OnHotKey(WPARAM wParam,LPARAM lParam)<br />{</p><p>UINT fuModifiers = (UINT) LOWORD(lParam); // key-modifier flags<br />UINT uVirtKey = (UINT) HIWORD(lParam); // virtual-key code </p><p>//判斷響應了什麼熱鍵<br />if( MOD_CONTROL == fuModifiers && 'D' == uVirtKey )<br />{<br />AfxMessageBox(_T("你按下了按鍵組合 ctrl + d"));<br />}<br />else if( MOD_ALT == fuModifiers && 'M' == uVirtKey )<br />{<br />AfxMessageBox(_T("你按下了按鍵組合 alt + m"));<br />}<br />else<br />AfxMessageBox(_T("你按下了未知熱鍵")); </p><p>return 0;<br />}
2)登記熱鍵
void CMyEdit2::Init()<br />{<br />//此函數可以在PreSubclassWindow和OnCreate中使用;<br />//如果不在前兩者中使用,可以到放到CDialog::OnInitDialog或者<br />//CView::OnInitialUpdate函數中使用</p><p>ASSERT(NULL != GetSafeHwnd());</p><p>//Register熱鍵<br />#ifdef _DEBUG //debug版本<br />int nRet = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D'); //熱鍵 ctrl + d<br />if(!nRet)<br />AfxMessageBox(_T("RegisterHotKey 0 false"));<br />nRet = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[1],MOD_ALT,'M'); //熱鍵 alt + m<br />if(!nRet)<br />AfxMessageBox(_T("RegisterHotKey 1 false"));<br />#else //release版本<br />RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D'); //熱鍵 ctrl + d<br />RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[1],MOD_ALT,'M'); //熱鍵 alt + m<br />#endif<br />}
3)Unregister熱鍵
void CMyEdit2::OnDestroy()<br />{<br />CEdit::OnDestroy();</p><p>//Unregister熱鍵<br />#ifdef _DEBUG<br />int nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);<br />if(!nRet)<br />AfxMessageBox(_T("UnregisterHotKey 0 false"));<br />nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);<br />if(!nRet)<br />AfxMessageBox(_T("UnregisterHotKey 1 false"));<br />#else<br />UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);<br />UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);<br />#endif</p><p>}
附:Init()的使用位置,這裡用變數IsInit(bool值)保證Init函數只被調用一次。
void CMyEdit2::PreSubclassWindow()<br />{<br />//初始化<br />if( !IsInit )<br />{<br />Init();<br />IsInit = true;<br />}</p><p>CEdit::PreSubclassWindow();<br />}</p><p>int CMyEdit2::OnCreate(LPCREATESTRUCT lpCreateStruct)<br />{<br />if (CEdit::OnCreate(lpCreateStruct) == -1)<br />return -1;</p><p>//初始化<br />if( !IsInit )<br />{<br />Init();<br />IsInit = true;<br />}</p><p>return 0;<br />}<br />
【二】(使用代碼發送)發送按鍵組合訊息
1)發送WM_HOTKEY訊息
WPARAM wParam;<br />LPARAM lParam;</p><p>//發送WM_HOTKEY訊息,響應 ctrl + d 按鍵<br />wParam = 0;<br />lParam = MAKELONG(MOD_CONTROL,'D');<br />::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);