MFC CHotKeyCtrl控件小记

MFC CHotKeyCtrl控件小记


1. 控件说明

HotKey控件主要用于获取热键值,从而进行热键注册操作。如下所示: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函数详细介绍

使用到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()获得的wModifiersRegisterHotKey()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);	//删除热键
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值