转载:http://www.cuteqt.com/blog/?p=2088

Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等。既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了。

注意,这个是Windows篇,就说明这些代码只支持windows系统。同时,也说明肯定还有其他平台的要写。不过要等O(∩_∩)O~

在Qt要调用Windows的API其实很简单,只要在需要用到的头文件中添加#include <windows.h>即可。不过要注意,Qt仅支持win32的API,像MFC之类的是不支持的。

想要在Qt里使用全局热键,最好的办法是重载QApplication里的winEventFilter函数。这个函数是用来响应Windows系统信息的。其函数原型为virtual bool winEventFilter(MSG *msg, long *result)。当msg指针中的message(MSG结构中的一个元素)为WM_HOTKEY类型时,就是用户激发了热键。整个过程和在VC的消息响应机制很类似,只不过换成了Qt而已。

而如果我们想要添加自己的全局热键,只需要使用RegisterHotKey函数即可。其函数原型为:

BOOL RegisterHotKey( HWND hWnd,     int id,     UINT fsModifiers,     UINT vk );

HWND类型是Windows中的窗口句柄类型,在Qt中,QWidget及其子类均可使用winId()函数得到。

第二个参数,是一个原子操作类型,用ATOM GlobalAddAtom(LPCTSTR lpString )函数得到。这也是一个Win32API,根据一个string参数可以得到一个唯一的值。使用完之后,必须使用GlobalDeleteAtom函数删除掉整个ATOM。其函数原型为ATOM GlobalDeleteAtom( ATOM nAtom )。

后面两个参数,一个是修饰键,一个是普通按键。例如,假设我们想注册Ctrl+F4这个热键组合,则fsModifiers就是MOD_CONTROL,而vk就是VK_F4。

如果注册成功,就返回true,否则,返回false。

注意,使用完之后,要使用UnregisterHotKey函数注销,否则你可能再也无法注册这个热键了!除非重启。其函数原型为:BOOL UnregisterHotKey(HWND hWnd,     int id )。

ok,热键注册就完成了。当按下热键后,我们就会在QApplication里的winEventFilter函数中收到一个msg。这个msg,前面也说过,我们需要知道它的一个元素message是不是WM_HOTKEY。如果是,就证明我们收到了Windows系统的热键信息。在MSG结构中,我们可能还需要理解的元素有两个,分别是wParam和lParam。wParam是注册热键时所用的id,也就是ATOM(原子)。而lParam就是我们的热键了。其实际上是一个32位的类型,前面16位代表普通按键,后16位代表的是修饰键。

至此,Qt在Windows下使用全局热键就完成了。如果有兴趣的朋友,还可以自己尝试一下,修改或直接自己写一份代码。

http://blog.csdn.net/calm_agan/article/details/6340077

Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)的更多相关文章

  1. Qt全局热键(windows篇)

      Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个 ...

  2. QT全局热键(用nativeKeycode封装API,不跨平台)

    在网上找了很长时间,大家都提到了一个QT全局热键库(qxtglobalshortcut),支持跨平台.在这篇文章中,我将只展示出windows平台下全局热键的设置. 这里提供的方法是在MyGlobal ...

  3. Qt 5.x 全局热键 for windows

    Qt 升级到5.x版本后,QAbstractEventDispatcher中函数发生变动,导致libqxt库中的qxtGlobalShortcut挂掉.参考qxtGlobalShortcut写了一个全 ...

  4. 使用WinAPI全局热键注册和全局模拟按键

    一.全局热键注册 1.先引用DLL [System.Runtime.InteropServices.DllImport("user32.dll")] //导入WinAPI publ ...

  5. C# register global hotkey ,onekey 注册多个全局热键以及单个全局热键

    我们需要用非Hook的方法,来给我们的app 或者winform注册热键. 就像下面的 , 欧陆词典注册的一个热键F6一样, 在winform最小化的情况下,也能够全局响应热键. 这里使用系统API来 ...

  6. c#为程序添加全局热键的方法

    在程序失去焦点或者在后台运行时,可以通过使用全局热键的方式,进行一些快捷的操作,如QQ默认操作中ctrl+alt+A调出截图功能. 在Windows中实现热键功能需要使用win32的Api函数Regi ...

  7. <转>MFC注册系统/全局热键。

    <转>MFC注册系统/全局热键. 1. BEGIN_MESSAGE_MAP(CRS232TESTDlg, CDialog) //{{AFX_MSG_MAP(CRS232TESTDlg) O ...

  8. Qt入门之基础篇(三):掌握Qt4的静态编译基本方法

    转载载请注明出处:CN_Simo. 导语: 前两章都提到过“静态编译”(Static Compilation),在Windows下一次静态编译差不多需要长达三个小时才能完成,而且还非常容易由于各种原因 ...

  9. Node.js安装及环境配置之Windows篇

    Node.js安装及环境配置之Windows篇   一.安装环境 1.本机系统:Windows 10 Pro(64位)2.Node.js:v6.9.2LTS(64位) 二.安装Node.js步骤 1. ...

随机推荐

  1. Data Guard 之 浅析Switchover与Failover

    Data Guard主从库之间的角色切换分为以下两种:1)SwitchoverSwithchover通常都是人为的有计划的进行角色互换,比如升级等.它通常都是无损的,即不会有数据丢失.其执行主要分为两 ...

  2. .Hibernate一对一映射与组件映射

    1.按照外键映射(Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射) 实现需要: 创建实体类Users1和Resume1 public class Users1 { p ...

  3. shell 死循环

      例1: 运行脚本后会自动加载firefox浏览器,并打开指定网页.如果用户关闭firefox,脚本会再次自动重新打开firefox.     如需结束循环,中止t2.sh进程即可.注意不要同时执行 ...

  4. 导出可执行的jar

    1.在你要导出的项目上单击右键,在弹出的右键菜单里选择:Export…选项. 2.在弹出的对话框里选择:,然后点击下边的Next; 3.在弹出的对话框里,点击选择导出后的jar存储路径以及文件名.(其 ...

  5. java06switch

    public class SwitchTest { public static void main(String[] args) { /** * 如果第一名,参加麻省理工大学组织的1个月夏令营 * 如 ...

  6. python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法

    一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...

  7. akka

    akka学习 http://www.cnblogs.com/libaoheng/archive/2012/03/19/2406836.html

  8. C#Css/Js静态文件压缩--Yui.Compressor.Net

    一.Asp.Net 自带静态文件压缩工具包 Microsoft.AspNet.Web.Optimization http://www.nuget.org/packages/Microsoft.AspN ...

  9. HTML5触摸屏touch事件使用介绍1

    市面上手机种类繁多,在触屏手机上运行的网页跟传统PC网页相比还是有很大差别的.由于设备的不同浏览器的事件的设计也不同.传统PC站的 click 和 onmouseover 等事件在一般触屏的手机上也可 ...

  10. 安全管理:IE6安全隐患重重 为何不离不弃

    安全服务商Zscaler的报告称,尽管微软IE6曾遭受一系列强势攻击并且新出的IE版本有更强的安全性能,但IE6依然受到各企业的热捧. 尽管微软一直敦促用户部署浏览器更新(截止2010年八月就将满九年 ...