当前位置: 代码迷 >> 综合 >> VC热键控件(Hot Key Controls)
  详细解决方案

VC热键控件(Hot Key Controls)

热度:93   发布时间:2023-12-09 00:09:22.0

简介:

热键控件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.
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.


(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;}

  相关解决方案