使用CHotKeyCtrl的几点总结

本文转载自http://blog.csdn.net/gxj1680/article/details/8198745

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

[cpp]  view plain  copy
  1. static  WORD Modifiers_HKCtrl_to_RegisterHK(WORD wSource)  
  2.     {  
  3.         //#define HOTKEYF_SHIFT           0x01  
  4.         //#define HOTKEYF_CONTROL         0x02  
  5.         //#define HOTKEYF_ALT             0x04  
  6.         //#define MOD_ALT         0x0001  
  7.         //#define MOD_CONTROL     0x0002  
  8.         //#define MOD_SHIFT       0x0004  
  9.         //#define MOD_WIN         0x0008  
  10.         WORD wRet = wSource;  
  11.         wRet &= ~HOTKEYF_EXT;       //过滤多余的可能多加的值0x1000  
  12.         if (wSource & HOTKEYF_ALT && wSource & HOTKEYF_SHIFT)  
  13.         {  
  14.             wSource &= ~HOTKEYF_ALT;  
  15.             wSource &= ~HOTKEYF_SHIFT;  
  16.   
  17.             wRet |= MOD_ALT;   
  18.             wRet |= MOD_SHIFT;   
  19.         }  
  20.         else  
  21.         {  
  22.             if(wSource & HOTKEYF_ALT)     
  23.             {     
  24.                 wRet &= ~HOTKEYF_ALT;     
  25.                 wRet |= MOD_ALT;     
  26.             }     
  27.             if(wSource & HOTKEYF_SHIFT)     
  28.             {     
  29.                 wRet &= ~HOTKEYF_SHIFT;     
  30.                 wRet |= MOD_SHIFT;     
  31.             }     
  32.         }  
  33.   
  34.         return wRet;  
  35.     }  


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

[cpp]  view plain  copy
  1. static  WORD Modifiers_RegisterHK_to_HKCtrl(WORD wSource)  
  2.     {  
  3.         //#define HOTKEYF_SHIFT           0x01  
  4.         //#define HOTKEYF_CONTROL         0x02  
  5.         //#define HOTKEYF_ALT             0x04  
  6.         //#define MOD_ALT         0x0001  
  7.         //#define MOD_CONTROL     0x0002  
  8.         //#define MOD_SHIFT       0x0004  
  9.         //#define MOD_WIN         0x0008  
  10.         WORD wRet = wSource;  
  11.         if (wSource & MOD_ALT && wSource & MOD_SHIFT)  
  12.         {  
  13.             wRet &= ~MOD_ALT;  
  14.             wRet &= ~MOD_SHIFT;  
  15.   
  16.             wRet |= HOTKEYF_ALT;  
  17.             wRet |= HOTKEYF_SHIFT;  
  18.         }  
  19.         else  
  20.         {  
  21.             if(wSource & MOD_ALT)     
  22.             {     
  23.                 wRet &= ~MOD_ALT;     
  24.                 wRet |= HOTKEYF_ALT;     
  25.             }     
  26.             if(wSource & MOD_SHIFT)     
  27.             {     
  28.                 wRet &= ~MOD_SHIFT;     
  29.                 wRet |= HOTKEYF_SHIFT;     
  30.             }     
  31.         }  
  32.         return wRet;  
  33.     }  

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值