vc 熱鍵、按鍵組合的用法 MFC c++ hotkey WM_HOTKEY

來源:互聯網
上載者:User

一下介紹的內容均在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);

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.