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

来源:互联网 发布:js 判断是function 编辑:程序博客网 时间:2024/06/05 23:50

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 thenVirtKey parameter in order to generate a WM_HOTKEY message. ThefsModifiers parameter can be a combination of the following values.
ValueDescriptionMOD_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;
    }



1 0