目录
使用方式1:系统全局快捷键。
使用方式2:软件全局快捷键。
使用方式3:软件指定界面快捷键。
示例工程下载
只要程序运行,全局快捷键可以在系统的任何地方被启用。
添加方式:
(1)向系统注册快捷键:
// 向系统注册热键
if (!RegisterHotKey(m_hWnd, 1001, MOD_CONTROL | MOD_SHIFT, 'S'))
{
AfxMessageBox(_T("Ctrl + Shift + S 快捷键冲突!"));
}
if (!RegisterHotKey(m_hWnd, 1002, MOD_CONTROL | MOD_SHIFT, 'H'))
{
AfxMessageBox(_T("Ctrl + Shift + H 快捷键冲突!"));
}
一般在使用窗口类的初始化函数中,或者OnCreate函数中
(2)在窗口类中响应WM_HOTKEY消息
在窗口类的.h中添加下面2个函数中任意一个函数的申明
afx_msg LRESULT OnHotKey(WPARAM wParam, LPARAM lParam);
afx_msg void OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2);
在窗口类的BEGIN_MESSAGE_MAP/END_MESSAGE_MAP中间添加下面2个响应消息中的任一一个
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
ON_WM_HOTKEY()//ON_WM_HOTKEY与WM_HOTKEY同时存在时,谁在BEGIN_MESSAGE_MAP的前面就响应谁
ON_MESSAGE(WM_HOTKEY, OnHotKey)
END_MESSAGE_MAP()
在窗口类的.cpp中添加下面两个函数定义中的任意一个
LRESULT CMainFrame::OnHotKey(WPARAM wParam, LPARAM lParam)
{
//处理热键
if (wParam == 1001)
{
AfxMessageBox(L"xixixi");
}
else if(wParam == 1002)
{
AfxMessageBox(L"hhh");
}
return 0;
}
void CMainFrame::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)//处理热键
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nHotKeyId == 1001 && nKey1 == (MOD_CONTROL | MOD_SHIFT) && nKey2 == 'S')
{
ShowWindow(SW_SHOW);
SetFocus();
}
else if (nHotKeyId == 1002 && nKey1 == (MOD_CONTROL | MOD_SHIFT) && nKey2 == 'H')
{
ShowWindow(SW_HIDE);
}
CMDIFrameWndEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}
注意:使用的函数定义、申明和消息映射必须是配套的。下面的结构就是一套的,其余的是另一套的。
afx_msg LRESULT OnHotKey(WPARAM wParam, LPARAM lParam);
ON_MESSAGE(WM_HOTKEY, OnHotKey)
LRESULT CMainFrame::OnHotKey(WPARAM wParam, LPARAM lParam)
{
//处理热键
if (wParam == 1001)
{
AfxMessageBox(L"xixixi");
}
else if(wParam == 1002)
{
AfxMessageBox(L"hhh");
}
return 0;
}
(3)软件关闭后释放全局快捷键。一般在窗口的OnClose函数中使用
// 程序运行完毕后解除热键
UnregisterHotKey(m_hWnd, 1001);
UnregisterHotKey(m_hWnd, 1002);
以上就是MFC的全局快捷键使用。
快捷键只能在当前软件中被响应,但是可以在任意窗口响应。(多见于单/多文档类型的软件)。注意:弹出模态对话框时快捷键消息会被阻断
添加方式:
(1)添加菜单中新的菜单项
(2) 添加菜单项的事件处理函数
afx_msg void OnShortCut3();//声明
ON_COMMAND(ID_SHORT_CUT3, &CShortcutTestDoc::OnShortCut3)//消息映射
void CShortcutTestDoc::OnShortCut3()//定义
{
AfxMessageBox(L"ShortCut3 Ctrl + G");
m_bShortCut3 = !m_bShortCut3;
}
(3)在新建的MFC文档视图的工程中,一般程序会添加一个默认的快捷键资源IDR_MAINFRAME。
在IDR_MAINFRAME中添加一个新的快捷键,然后将快捷键的ID设置成ID_SHORT_CUT3即可。
快捷键只能在我们预设的窗口中被响应。当窗口失去焦点时,快捷键无法被响应。
添加方式:
(1)添加新的菜单项和菜单项的事件处理函数。添加方式同使用方式2:软件全局快捷键。
(2)在工程的资源窗口新建一个快捷键资源
然后在新的快捷键资源表中添加 快捷键
(3)在预设窗口类中添加变量
HACCEL m_hAccel;
在窗口类的初始化函数里添加
m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
(4)重写窗口类的 BOOL PreTranslateMessage(MSG* pMsg)虚函数,并在其中添加如下代码即可
BOOL CShortcutTestView::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (m_hAccel && ::TranslateAccelerator(GetSafeHwnd(), m_hAccel, pMsg))
return TRUE;
return CView::PreTranslateMessage(pMsg);
}
下载地址:https://download.csdn.net/download/qq_23992597/85681721