VC中的RegisterHotKey函数与HotKey控件(CHotKeyCtrl)

1 篇文章 0 订阅

1、其实,关于RegisterHotKey函数本人写过一个简单的示例,主要是利用这个函数实现全局热键。

具体的链接:http://blog.csdn.net/wwkaven/article/details/30719563


2、本文记录的重点是通过Hot Key控件设置的热键,如何正确的用RegisterHotKey函数注册。


3、思路很清晰,将用户在控件的输入通过函数GetHotKey获得,获取到的值包括两个,一个是热键的组合类型,譬如Ctrl + X、Shift + X、ALT + X或者Ctrl + Shift + X,而另一个就是X。


4、但是,我们发现直接将GetHotKey获取到的值代入RegisterHotKey函数执行,有时会出问题。当然,这里所谓的问题不是编译的问题,而是当你注册了一个热键,却发现一直不进热键的消息函数。


5、具体的情况是:

(1)形如Ctrl + X的热键一切正常;

(2)形如Shift + X和Alt + X的热键不响应;

... ...


6、如果细心的朋友会发现,当你在控件中设置热键为Shift + X并直接调用函数RegisterHotKey时,其实注册的结果是Alt + X。也就是说,Shift和Alt这两个值搞反了。


7、那么,是不是一个Bug呢?我们不放仔细看一下两者的定义:

(1)RegisterHotkey函数第三个参数的说明:

fsModifiers
[in] Specifies keys that must be pressed in combination with the key specified by the nVirtKey parameter in order to generate a WM_HOTKEY message. The fsModifiers parameter can be a combination of the following values.
ValueDescription
MOD_ALTEither ALT key must be held down.
MOD_CONTROLEither CTRL key must be held down.
MOD_KEYUPBoth key up events and key down events generate a WM_HOTKEY message.
MOD_SHIFTEither SHIFT key must be held down.
MOD_WINEither WINDOWS key was held down. These keys are labeled with the Microsoft Windows logo.


(2)在看一下GetHotKey第二个参数的说明:

Call this function to retrieve the virtual key code and modifier flags of a hot key from a hot key control.

DWORD GetHotKey( ) const;
void GetHotKey(
   WORD &wVirtualKeyCode,
   WORD &wModifiers 
) const;
Parameters
wVirtualKeyCode
Virtual key code of the hot key. For a list of standard virtual key codes, see Winuser.h.
wModifiers
Modifier flags indicating the keys that, when used in combination with wVirtualKeyCode, define a hot key combination.
Return Value

In the first usage above, a DWORD containing the virtual key code and modifier flags. The low-order word is the virtual key code, and the high-order word is the modifier flags. The HIWORD and LOWORD of this 32-bit value can be used as the parameters in the SetHotKey member function.

Remarks

The modifier flags can be a combination of the following values:

  • HOTKEYF_ALT   ALT key
  • HOTKEYF_CONTROL   CTRL key
  • HOTKEYF_EXT   Extended key
  • HOTKEYF_SHIFT   SHIFT key 

8、注意我标红的地方,下面我们看一下定义:

(1)Microsoft SDKs\Windows\v7.0A\Include\WinUser.h

#define  MOD_ALT         0x0001
#define MOD_CONTROL     0x0002
#define  MOD_SHIFT       0x0004

(2)Microsoft SDKs\Windows\v7.0A\Include\CommCtrl.h

#define  HOTKEYF_SHIFT           0x01
#define HOTKEYF_CONTROL         0x02
#define  HOTKEYF_ALT             0x04

9、这下问题清楚了,提供两个转换函数:

     UINT  ModToHotkey( UINT  fsModifiers)
     {
         if  ( (fsModifiers & MOD_SHIFT) && !(fsModifiers & MOD_ALT) )  // shift转alt
         {
             fsModifiers &= ~MOD_SHIFT;
             fsModifiers |= HOTKEYF_SHIFT;
         }
         else  if  ( !(fsModifiers & MOD_SHIFT) && (fsModifiers & MOD_ALT) )  // alt转shift
         {
             fsModifiers &= ~MOD_ALT;
             fsModifiers |= HOTKEYF_ALT;
         }
         return  fsModifiers;
     }
 
     UINT  HotkeyToMod( UINT  fsModifiers)
     {
         if  ( (fsModifiers & HOTKEYF_SHIFT) && !(fsModifiers & HOTKEYF_ALT) )  // shift转alt
         {
             fsModifiers &= ~HOTKEYF_SHIFT;
             fsModifiers |= MOD_SHIFT;
         }
         else  if  ( !(fsModifiers & HOTKEYF_SHIFT) && (fsModifiers & HOTKEYF_ALT) )  // alt转shift
         {
             fsModifiers &= ~HOTKEYF_ALT;
             fsModifiers |= MOD_ALT;
         }
         return  fsModifiers;
     }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值