Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)

转载: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

时间: 2024-10-25 03:40:04

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

Qt全局热键(windows篇)

Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是Windows篇,就说明这些代码只支持windows系统.同时,也说明肯定还有其他平台的要写.不过要等O(∩_∩)O~ 在Qt要调用Windows的API其实很简单,只要在需要用到的头文件中添加#include <windows.h>即可.不过要注意,Qt仅支持win32的API,像MFC之类的是不

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

在网上找了很长时间,大家都提到了一个QT全局热键库(qxtglobalshortcut),支持跨平台.在这篇文章中,我将只展示出windows平台下全局热键的设置. 这里提供的方法是在MyGlobalShortCut里面完成Windows的API封装,并在main.cpp中使用. 直接上代码: MyWinEventFilter类: class MyWinEventFilter :public QAbstractNativeEventFilter { public: MyWinEventFilte

Qt 5.x 全局热键 for windows

Qt 升级到5.x版本后,QAbstractEventDispatcher中函数发生变动,导致libqxt库中的qxtGlobalShortcut挂掉.参考qxtGlobalShortcut写了一个全局热键类,用法与qxtGlobalShortcut一致.在 Win8.1 + Qt 5.11 能正常使用 _______________________________________________________________________   用法 ____________________

C# 全局热键设置 与 窗体热键设置

1. 窗体热键 首先要设置主窗体KeyPreview为true,可直接在属性中进行设置, 或者在窗体加载中设置: this.KeyPreview = true; 然后添加窗体KeyDown事件,如下: private void FrmMain_KeyDown(object sender, KeyEventArgs e) { if (e.Alt && e.Shift && e.Control && e.KeyCode == Keys.S) { MessageB

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

一.全局热键注册 1.先引用DLL [System.Runtime.InteropServices.DllImport("user32.dll")] //导入WinAPI public static extern bool RegisterHotKey( //设置热键 IntPtr hWnd, // 窗口句柄,一般使用Handle属性 int id, // 区别热键的ID号,这个可以随便写,只是用来区分不同热键 uint fsModifiers, // 修正键用户接下哪些键是发生 可能

Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装

转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且允许真正地组件编程.基本上,Qt同X Window上的Motif,Openwin,GTK等图形界面库以及Windows平台上的MFC.OWL.VCL.ATL是同类型的东西. 本系列教程以Qt5.6为基础展开精讲. 参考书目: [1]霍亚飞.Qt Creator快速入门(第3版).2017年 [2]蔡

Qt程序在Windows上发布

最近写好了一个Qt5的小程序,并且已经配置好了所有的依赖库,需要发布. 这个主要是讲发布的 查找依赖库请看我的另一篇博客 Qt的程序在其他电脑上使用 http://blog.csdn.net/homechao/article/details/9113531 因为所有的文件比较大约70M左右,直接复制比较慢,也容易丢失文件 在网上看了很多使用第三方的软件进行打包,倒也是可以使用就是比较麻烦点 其实Windows上都已经有现成的打包软件啦,大家可能天天用,都没想到吧 那就是RAR,用起来非常简单,我

Java设置全局热键——第三方包jintellitype实现

Java原生API并不支持为应用程序设置全局热键.要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/C++的javaer来说,有点困难.不过幸好,国外有人已经实现了,发布成第三方java包,借此,我们可以很方便的设置全局热键而不用编写任何C/C++代码. jintellitype官网貌似目前访问不到,这里提供下载:http://pan.baidu.com/s/1kTIDxgN. 我实现的演示Demo源码下载:http://pan.baidu.com/s/1

全局热键

Demo下载:https://git.oschina.net/xieyimo9/quanjurejian.git 主要代码: procedure TForm1.HotKey(var msg: TMessage); begin if msg.WParam =FHotKeyId_Alt_Down then Memo1.Lines.Add('Alt Down') else if msg.WParam =FHotKeyId_Alt_Up then Memo1.Lines.Add('Alt Up') el