在Windows操作系统下的Qt全局热键

移动开发
Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等。

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

注意,这个是Windows篇,就说明这些代码只支持windows系统。同时,也说明肯定还有其他平台的要写。

在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函数即可。其函数原型为:

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

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

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

  1. ATOM GlobalDeleteAtom( ATOM nAtom ) 

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

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

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

  1. 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下使用全局热键就完成了。如果有兴趣的朋友,还可以自己尝试一下,修改或直接自己写一份代码。

【编辑推荐】

  1. QML教程:Qtmediahub项目概述
  2. QML教程:Qt-Quick六大开源组件
  3. QML教程:构建和安装QtComponents
  4. Qt in Scala(JVM)开发梗概
  5. 用Scala实现Qt QWidget对象的Eventable接口
责任编辑:佚名 来源: cuteqt
相关推荐

2010-05-12 15:34:26

MySQL编码设置

2011-06-20 11:14:09

Qt QxtGlobalS 热键

2009-02-20 19:56:26

WindowsLinux双系统

2010-04-19 15:11:25

Unix操作系统

2009-12-08 18:02:50

2009-04-01 14:42:11

操作系统同步MySQL

2009-12-15 10:47:29

linux操作系统

2014-08-21 09:48:33

操作系统

2009-06-25 08:55:53

Linux

2009-07-07 09:18:13

UNIX操作系统

2009-06-19 20:35:07

Linux操作系统

2011-01-05 10:32:31

linuxqq

2010-08-11 11:13:27

DB2 pe

2010-04-14 16:45:15

Unix操作系统

2009-08-19 09:43:41

Windows 7输入公式

2010-06-07 10:44:01

MySQL远程登陆

2009-07-03 08:49:09

Linuxtelnet安全

2009-12-04 17:54:07

Windows 7操作

2014-04-22 10:25:31

Windows 10云操作系统

2009-04-22 08:58:24

Windows 7微软操作系统
点赞
收藏

51CTO技术栈公众号