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

最新文章

  1. [LeetCode] Transpose File 转置文件
  2. EventBus3.0源码解析
  3. MySQL数据库4 - 查看数据表
  4. [COJ0985]WZJ的数据结构(负十五)
  5. static关键字用法
  6. HDU 5768:Lucky7(中国剩余定理 + 容斥原理)
  7. 职业操盘手内部教材 z
  8. XAMPP搭建的几个注意事项
  9. JAVA $ JSP
  10. 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件
  11. 3. 编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,统计鱼的数量
  12. Ubuntu Nginx安装
  13. SG函数和SG定理【详解】
  14. 永久开启完整版Google Play
  15. python操作redis命令
  16. GIT初始学习记录
  17. TLS握手、中断恢复与证书中心的原因
  18. 考研部分概念和流程(若不全和错误可提示我补充,另考研帮app推荐)
  19. mysql试题
  20. Linux Samba服务主配文件smb.conf中文详解【转】

热门文章

  1. ALT+数字,可输入汉字或拉丁字母 good
  2. JAVA与C++的区别和联系
  3. C++和java的区别
  4. linux c/c++ GDB教程详解
  5. Oracle备忘录
  6. poj1160Post Office(DP)
  7. windows下的BT服务器搭建方案
  8. 获得设备型号(含iPhone6 , iPhone 6+)
  9. HTMLPARSER.NET 参考资料
  10. Tdxtreelist 行变色