VC热键控件(Hot Key Controls)

简介:

热键控件Hot Key Controls,是一个控件,就像IP控件一样,方便输入IP地址,同理,热键控件是方便输入热键的

这要和VC的热键区分开,举个例子,你开发的软件需要支持快捷键操作,而且用户可以自定义快捷键。

那么你的工作有两步:

第一步是有个界面,提供给用户设置自定义快捷键

第二步你获取到用户设置的快捷键,将此快捷键注册为热键,在程序中响应就可以了


本文介绍的hot key Controls就是第一步里提供给用户输入的,具体使用方法不多说,会用edit控件就会用它,主要就三个api

gethotkey,sethotkey,gethotkeyname

第二步 VC热键的使用方法见此: http://blog.csdn.net/rankun1/article/details/69389029


补充:

热键控件gethotkey获得到的虚拟码和VC热键注册时的虚拟码是不匹配的,使用时记得转换,下面详细介绍

下面介绍的重点是通过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的热键不响应;

(3)单纯的Left Right Up Down按键也无效(主要多了一个HOTKEYF_EXT,转换函数中有说明)

... ...


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 SDKsWindowsv7.0AIncludeWinUser.h

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

(2)Microsoft SDKsWindowsv7.0AIncludeCommCtrl.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)
    {
	//某些快捷键例如Left Right Up Down等设置好后,GetHotKey 
	//得到的fsModifiers会多一个HOTKEYF_EXT,RegisterHotKey不需要,这里需要去掉
	fsModifiers &= ~HOTKEYF_EXT;

        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
发出的红包

打赏作者

Barry__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值