转自:http://blog.csdn.net/hityct1/article/details/3853666
vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY收藏
vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY收藏
2009-02-22 19:26
一下介绍的内容均在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:
- //{{AFX_MSG(CMyEdit2)
- afx_msg void OnDestroy();
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- //}}AFX_MSG
- afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);//手动加入
- DECLARE_MESSAGE_MAP()
在.cpp文件中加入ON_MESSAGE(WM_HOTKEY,OnHotKey),具体位置在:
- BEGIN_MESSAGE_MAP(CMyEdit2, CEdit)
- //{{AFX_MSG_MAP(CMyEdit2)
- ON_WM_CHAR()
- ON_WM_DESTROY()
- ON_WM_CREATE()
- //}}AFX_MSG_MAP
- ON_MESSAGE(WM_HOTKEY,OnHotKey) //手动加入
- END_MESSAGE_MAP()
定义响应函数:
- LONG CMyEdit2::OnHotKey(WPARAM wParam,LPARAM lParam)
- {
- UINT fuModifiers = (UINT) LOWORD(lParam); // key-modifier flags
- UINT uVirtKey = (UINT) HIWORD(lParam); // virtual-key code
- //判断响应了什么热键
- if( MOD_CONTROL == fuModifiers && 'D' == uVirtKey )
- {
- AfxMessageBox(_T("你按下了组合键 ctrl + d"));
- }
- else if( MOD_ALT == fuModifiers && 'M' == uVirtKey )
- {
- AfxMessageBox(_T("你按下了组合键 alt + m"));
- }
- else
- AfxMessageBox(_T("你按下了未知热键"));
- return 0;
- }
2)登记热键
- void CMyEdit2::Init()
- {
- //此函数可以在PreSubclassWindow和OnCreate中使用;
- //如果不在前两者中使用,可以到放到CDialog::OnInitDialog或者
- //CView::OnInitialUpdate函数中使用
- ASSERT(NULL != GetSafeHwnd());
- //Register热键
- #ifdef _DEBUG //debug版本
- int nRet = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D'); //热键 ctrl + d
- if(!nRet)
- AfxMessageBox(_T("RegisterHotKey 0 false"));
- nRet = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[1],MOD_ALT,'M'); //热键 alt + m
- if(!nRet)
- AfxMessageBox(_T("RegisterHotKey 1 false"));
- #else //release版本
- RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D'); //热键 ctrl + d
- RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[1],MOD_ALT,'M'); //热键 alt + m
- #endif
- }
3)Unregister热键
- void CMyEdit2::OnDestroy()
- {
- CEdit::OnDestroy();
- //Unregister热键
- #ifdef _DEBUG
- int nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);
- if(!nRet)
- AfxMessageBox(_T("UnregisterHotKey 0 false"));
- nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);
- if(!nRet)
- AfxMessageBox(_T("UnregisterHotKey 1 false"));
- #else
- UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);
- UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);
- #endif
- }
附:Init()的使用位置,这里用变量IsInit(bool值)保证Init函数只被调用一次。
- void CMyEdit2::PreSubclassWindow()
- {
- //初始化
- if( !IsInit )
- {
- Init();
- IsInit = true;
- }
- CEdit::PreSubclassWindow();
- }
- int CMyEdit2::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CEdit::OnCreate(lpCreateStruct) == -1)
- return -1;
- //初始化
- if( !IsInit )
- {
- Init();
- IsInit = true;
- }
- return 0;
- }
【二】(使用代码发送)发送组合键消息
1)发送WM_HOTKEY消息
- WPARAM wParam;
- LPARAM lParam;
- //发送WM_HOTKEY消息,响应 ctrl + d 按键
- wParam = 0;
- lParam = MAKELONG(MOD_CONTROL,'D');
- ::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);
注:如果需要实现非组合键的快捷键,可以将 RegisterHotKey第三个参数设置为NULL