VC中的RegisterHotKey函数与HotKey控件(CHotKeyCtrl)
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. |
(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;
}
|
VC中的RegisterHotKey函数与HotKey控件(CHotKeyCtrl)相关推荐
- qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示
---恢复内容开始--- qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示 打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分, ...
- 鸡啄米vc++2010系列27(列表视图控件List Control 上)
列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁.直观,在实际应用中能为用户带来方便. 列表视图控件是对前面讲到 ...
- 在DWZ框架中整合kindeditor复文本框控件
今天上午在DWZ框架中整合kindeditor复文本框控件,发现上传图片是老是提示 "上传中,请稍候...",上网查看别人说可能是文件路径问题,在想以前在其他项目中用这个控件一直没 ...
- [html] 怎样去除iOS和Android中的输入URL地址的控件条呢?
[html] 怎样去除iOS和Android中的输入URL地址的控件条呢? setTimeout(scrollTo,0,0,0); 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚 ...
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值(解决方案) 参考文章: (1)VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日 ...
- 在一个窗体中调用另一个窗体的控件或方法(C#)
在一个窗体中调用另一个窗体的控件或方法 解决方案:从构造函数中传递参数(Form). 1.将Form1中的控件改成public属性 具体实现过程请参看一下代码(在form1的textbox1中输入然后 ...
- VB中实现IObjectSafety接口以声明控件安全的方法
VB中实现IObjectSafety接口以声明控件安全的方法 转载自:http://www.cnblogs.com/Shana/archive/2009/06/24/VB_Iobjsafe.html ...
- 在WINCC中使用自定义的动画效果控件ocx
在wincc中有时需要使用自定义的ocx控件来实现效果,如下可实现 启动wincc任意打开一画面,在工具中找到"控件", 双击打开,如下图: 点击"注册",后打 ...
- android togglebutton 动画,如何在Android中使用ToggleButton多状态按钮控件
如何在Android中使用ToggleButton多状态按钮控件 发布时间:2020-12-05 16:53:37 来源:亿速云 阅读:84 作者:Leah 这篇文章给大家介绍如何在Android中使 ...
最新文章
- Microsoft Visual C++ Compiler for Python
- java 用程序代码解释继承_关于初级java程序员笔试题
- 九度OJ 1336:液晶屏裁剪 (GCD)
- 蓝桥杯_算法训练_字串统计
- 网络编辑日常工作的内容有哪些?
- 初学者python笔记(filter()函数完全详解)
- java对象关系_【java类和对象的关系】
- Ubuntu18.04之有道词典安装
- mysql 大于小于不可在一个不等式中同时写
- hdu和poj的基础dp30道
- 如何修复 MacBook Pro 电池寿命?
- 第五章 循环结构课后思考
- 计算机建筑制图实践报告,工程建筑实习报告范文(精选5篇)
- nmap命令扫描存活主机
- vue中使用iconfont图标
- 计算机网络部分英文缩写汇总
- web前端开发面试题(六)
- 友盟分享——微信、腾讯微博、新浪微博分享失败原因分析
- 自学 Photoshop 2022 Mac版-笔记1
- Android菜鸟笔记-WifiPickerActivity 实现跳转到系统自带wifi连接界面