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