使用CHotKeyCtrl的几点总结

注:以下CHotKeyCtrl情况的环境是ATL,不知MFC中是否如此,没有验证,需注意

1. 某些情况下,不允许只输入一个不带fsModifiers只有VK键的情况下,可以使用m_editHotkey.SetRules(HKCOMB_NONE, HOTKEYF_CONTROL | HOTKEYF_ALT); //关键是HKCOMB_NONE参数


2. CHotKeyCtrl::SetHotKey和GetHotKey中的wModifiers和RegisterHotKey中的fsModifiers不同:

a. 从CHotKeyCtrl控件得到的Alt和Shift分别是HOTKEYF_ALT和HOTKEYF_SHIFT,而RegisterHotKey中的Alt和Shift则为MOD_ALT和MOD_SHIFT,所以GetHotKey之后,若要注册则需要进行转换

static	WORD Modifiers_HKCtrl_to_RegisterHK(WORD wSource)
	{
		//#define HOTKEYF_SHIFT           0x01
		//#define HOTKEYF_CONTROL         0x02
		//#define HOTKEYF_ALT             0x04
		//#define MOD_ALT         0x0001
		//#define MOD_CONTROL     0x0002
		//#define MOD_SHIFT       0x0004
		//#define MOD_WIN         0x0008
		WORD wRet = wSource;
		wRet &= ~HOTKEYF_EXT;		//过滤多余的可能多加的值0x1000
		if (wSource & HOTKEYF_ALT && wSource & HOTKEYF_SHIFT)
		{
			wSource &= ~HOTKEYF_ALT;
			wSource &= ~HOTKEYF_SHIFT;

			wRet |= MOD_ALT; 
			wRet |= MOD_SHIFT; 
		}
		else
		{
			if(wSource & HOTKEYF_ALT)   
			{   
				wRet &= ~HOTKEYF_ALT;   
				wRet |= MOD_ALT;   
			}   
			if(wSource & HOTKEYF_SHIFT)   
			{   
				wRet &= ~HOTKEYF_SHIFT;   
				wRet |= MOD_SHIFT;   
			}   
		}

		return wRet;
	}


b. SetHotKey时,也需要调用相关的转换函数

static	WORD Modifiers_RegisterHK_to_HKCtrl(WORD wSource)
	{
		//#define HOTKEYF_SHIFT           0x01
		//#define HOTKEYF_CONTROL         0x02
		//#define HOTKEYF_ALT             0x04
		//#define MOD_ALT         0x0001
		//#define MOD_CONTROL     0x0002
		//#define MOD_SHIFT       0x0004
		//#define MOD_WIN         0x0008
		WORD wRet = wSource;
		if (wSource & MOD_ALT && wSource & MOD_SHIFT)
		{
			wRet &= ~MOD_ALT;
			wRet &= ~MOD_SHIFT;

			wRet |= HOTKEYF_ALT;
			wRet |= HOTKEYF_SHIFT;
		}
		else
		{
			if(wSource & MOD_ALT)   
			{   
				wRet &= ~MOD_ALT;   
				wRet |= HOTKEYF_ALT;   
			}   
			if(wSource & MOD_SHIFT)   
			{   
				wRet &= ~MOD_SHIFT;   
				wRet |= HOTKEYF_SHIFT;   
			}   
		}
		return wRet;
	}

b. 从HOTKEYF_SHIFT、HOTKEYF_ALT和MOD_SHIFT、MOD_ALT可以看出,Shift和Alt在CHotKeyCtrl中是相反的(获取的值是你想要的对方的值,不太好说,明白?)


3. 使用GetHotKey要注意,在某些情况下同一个wModifiers值缺得到了不同的值,如:Ctrl + Up和Ctrl + 'P'得到的wModifiers(Ctrl)值不同,当然Shift、Alt得到的值也不同,都比正常值大了0x1000,即HOTKEYF_EXT,所以在GetHotKey时要过滤其中的项,否则调用RegisterHotKey时,函数注册成功了,但没有响应

你可能感兴趣的:(使用CHotKeyCtrl的几点总结)