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
Value | Description |
---|---|
MOD_ALT | Either ALT key must be held down. |
MOD_CONTROL | Either CTRL key must be held down. |
MOD_KEYUP | Both key up events and key down events generate a WM_HOTKEY message. |
MOD_SHIFT | Either SHIFT key must be held down. |
MOD_WIN | Either WINDOWS key was held down. These keys are labeled with the Microsoft Windows logo. |
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;
}
|