使用CHotKeyCtrl的几点总结

来源:互联网 发布:python 元组 编辑:程序博客网 时间:2024/05/17 21:56

注:以下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之后,若要注册则需要进行转换

staticWORD 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         0x0008WORD wRet = wSource;wRet &= ~HOTKEYF_EXT;//过滤多余的可能多加的值0x1000if (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时,也需要调用相关的转换函数

staticWORD 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         0x0008WORD 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时,函数注册成功了,但没有响应

原创粉丝点击