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. 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 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)相关推荐

  1. qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示

    ---恢复内容开始--- qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示 打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分, ...

  2. 鸡啄米vc++2010系列27(列表视图控件List Control 上)

    列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁.直观,在实际应用中能为用户带来方便. 列表视图控件是对前面讲到 ...

  3. 在DWZ框架中整合kindeditor复文本框控件

    今天上午在DWZ框架中整合kindeditor复文本框控件,发现上传图片是老是提示 "上传中,请稍候...",上网查看别人说可能是文件路径问题,在想以前在其他项目中用这个控件一直没 ...

  4. [html] 怎样去除iOS和Android中的输入URL地址的控件条呢?

    [html] 怎样去除iOS和Android中的输入URL地址的控件条呢? setTimeout(scrollTo,0,0,0); 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚 ...

  5. VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)

    VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值(解决方案) 参考文章: (1)VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日 ...

  6. 在一个窗体中调用另一个窗体的控件或方法(C#)

    在一个窗体中调用另一个窗体的控件或方法 解决方案:从构造函数中传递参数(Form). 1.将Form1中的控件改成public属性 具体实现过程请参看一下代码(在form1的textbox1中输入然后 ...

  7. VB中实现IObjectSafety接口以声明控件安全的方法

    VB中实现IObjectSafety接口以声明控件安全的方法 转载自:http://www.cnblogs.com/Shana/archive/2009/06/24/VB_Iobjsafe.html ...

  8. 在WINCC中使用自定义的动画效果控件ocx

    在wincc中有时需要使用自定义的ocx控件来实现效果,如下可实现 启动wincc任意打开一画面,在工具中找到"控件", 双击打开,如下图: 点击"注册",后打 ...

  9. android togglebutton 动画,如何在Android中使用ToggleButton多状态按钮控件

    如何在Android中使用ToggleButton多状态按钮控件 发布时间:2020-12-05 16:53:37 来源:亿速云 阅读:84 作者:Leah 这篇文章给大家介绍如何在Android中使 ...

最新文章

  1. Microsoft Visual C++ Compiler for Python
  2. java 用程序代码解释继承_关于初级java程序员笔试题
  3. 九度OJ 1336:液晶屏裁剪 (GCD)
  4. 蓝桥杯_算法训练_字串统计
  5. 网络编辑日常工作的内容有哪些?
  6. 初学者python笔记(filter()函数完全详解)
  7. java对象关系_【java类和对象的关系】
  8. Ubuntu18.04之有道词典安装
  9. mysql 大于小于不可在一个不等式中同时写
  10. hdu和poj的基础dp30道
  11. 如何修复 MacBook Pro 电池寿命?
  12. 第五章 循环结构课后思考
  13. 计算机建筑制图实践报告,工程建筑实习报告范文(精选5篇)
  14. nmap命令扫描存活主机
  15. vue中使用iconfont图标
  16. 计算机网络部分英文缩写汇总
  17. web前端开发面试题(六)
  18. 友盟分享——微信、腾讯微博、新浪微博分享失败原因分析
  19. 自学 Photoshop 2022 Mac版-笔记1
  20. Android菜鸟笔记-WifiPickerActivity 实现跳转到系统自带wifi连接界面

热门文章

  1. 开发工具|H5微应用本地开发新姿势
  2. ureka高可用配置 及其clound知识点
  3. vue加载three模型成功,但显示黑屏?
  4. adobe所有Android软件,Adobe Scan安卓app
  5. java项目常见业务模块,C6 架构系列——Maven多模块划分和结构
  6. Matlab并行计算parpool使用方法+代码
  7. 手机信息备份和恢复系统
  8. itextpdf 生成表格pdf+背景图片(可转图片)
  9. c++ 代码获取CPU温度
  10. RabbitMQ-高级