MFC CHotKeyCtrl控件小记
1. 控件说明
HotKey控件主要用于获取热键值,从而进行热键注册操作。如下所示:
2. 设置默认热键
CHotKeyCtrl类详细信息见:CHotKeyCtrl类的说明
设置默认热键,使用到CHotKeyCtrl::SetHotKey
函数
void SetHotKey(
WORD wVirtualKeyCode, //虚拟键代码
WORD wModifiers //辅助键设置
);
wVirtualKeyCode
为虚拟键代码,各个键的代码见:虚拟键码表
wModifiers
为辅助键,如Alt,Ctrl等。其取值如下表所示:
值 | 解释 |
---|---|
HOTKEYF_ALT(0x04) | Alt 键 |
HOTKEYF_CONTROL(0x02) | Ctrl 键 |
HOTKEYF_EXT (0x08) | 扩展键 |
HOTKEYF_SHIFT(0x01) | Shift 键 |
使用例
//设置热键 Alt + E
m_hotkey.SetHotKey(0x45, HOTKEYF_ALT); //查询虚拟键码表知 E键值为0x45
设置好热键后,窗口还不能响应热键,还需要注册热键。
读取热键
使用CHotKeyCtrl::GetHotKey
函数读取热键
DWORD GetHotKey() const;
//返回值 低位字的低位包含虚拟键码,低位字的高位包含辅助键设置,高位字为零。
//重载
void GetHotKey(
WORD& wVirtualKeyCode, //虚拟键代码
WORD& wModifiers //辅助键设置
) const;
使用例
//获取热键
WORD vk, Modifiers;
m_hotkey.GetHotKey(vk, Modifiers);
3. 注册热键
使用到RegisterHotKey
函数
BOOL RegisterHotKey(
HWND hWnd, //响应热键窗口句柄
int id, //热键id号
UINT fsModifiers, //辅助键设置
UINT vk //虚拟键代码
);
fsModifiers
取值如下表所示:
值 | 解释 |
---|---|
MOD_ALT(0x0001) | Alt 键 |
MOD_CONTROL(0x0002) | Ctrl 键 |
MOD_NOREPEAT(0x4000) | 使键盘自动重复不会产生多个热键通知 |
MOD_SHIFT(0x0004) | Shift 键 |
MOD_WIN(0x0008) | Win键(涉及Win键的键盘快捷键被保留给操作系统使用) |
RegisterHotKey
函数无需配合CHotKeyCtrl控件,自身就可以注册热键
使用例
//注册热键 Alt + E
if (RegisterHotKey(m_hWnd, 123, MOD_NOREPEAT | MOD_ALT, 0x45))
AfxMessageBox(L"热键注册成功 ");
本文配合CHotKeyCtrl控件,来使用RegisterHotKey
函数
使用例
注意
GetHotKey()
获得的wModifiers
与RegisterHotKey()
的fsModifiers
值并不对应,需要进行转换
UINT getfsModifiers(WORD wModifiers);
//获取热键
WORD vk, Modifiers; //虚拟键代码,辅助键设置
m_hotkey.GetHotKey(vk, ModiModfiers);
//注册热键 // ↓↓ 获得的Modfiers要经过转换
if (RegisterHotKey(m_hWnd, 123, getfsModifiers(Modifiers) | MOD_NOREPEAT, vk))
AfxMessageBox(L"热键注册成功 " + m_hotkey.GetHotKeyName());
//转换得到 fsModifiers
UINT getfsModifiers(WORD wModifiers)
{
switch (wModifiers)
{
case HOTKEYF_ALT: return MOD_ALT;
case HOTKEYF_CONTROL: return MOD_CONTROL;
case HOTKEYF_SHIFT: return MOD_SHIFT;
}
}
热键注册完毕,就可以响应WM_HOTKEY
消息处理热键了。
注册热键最好在对话框初始化时。
4. 消息处理
建议使用类向导添加
WM_HOTKEY
消息
ON_WM_HOTKEY() //添加消息宏
//消息处理函数
void CPlayerConfDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
AfxMessageBox(L"接受热键");
if(nHotKeyId == 123) //根据热键id处理
AfxMessageBox(L"热键为"+m_hotkey.GetHotKeyName());
CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);
}
5. 注销热键
不再使用热键时应注销热键,使用UnregisterHotKey
函数
BOOL UnregisterHotKey(
HWND hWnd, //使用热键的窗口句柄,热键没有与窗口关联参数为NULL
int id //热键id
);
使用例
UnregisterHotKey(m_hWnd, 123);//删除 id为123 热键
PS 设置全局热键呼出窗口
无需注册热键,通过发送WM_SETHOTKEY
消息实现,无法响应WM_HOTKEY
消息
SendMessage(WM_SETHOTKEY, m_hotkey.GetHotKey()); //按下热键 呼出窗口
SendMessage(WM_SETHOTKEY, NULL); //删除热键