linux下qt响应全局热键,Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)...

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

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

在Qt要调用Windows的API其实很简单,只要在需要用到的头文件中添加#include 即可。不过要注意,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篇)

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

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

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

Qt 5.x 全局热键 for windows

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

Linux/CentOS优化配置 汇总

[强烈要求做的]CentOS启用sudo,禁用root远程登录 Linux命令行修改IP.网关.DNS.主机名 的方法 Linux开机直接进入“命令行”模式 更改CentOS 6.x yum源为国内1 ...

Ajax技术使用

int (*p)[4] 与 int* p[4]

碰到一道题: ][] = {,,,,,,,,,,,}; ]; ] = (a+); cout<

Hexo

Hexo Hexo is a fast, simple & powerful blog framework powered by Node.js.

永久设置 NLS&lowbar;DATE&lowbar;FORMAT 方法

在客户端(如WEB服务器),设置环境变量即可,如: NLS_DATE_FORMAT YYYY-MM-DD HH24:MI:SS   在程序处执行会影响后续SQL性能 ALTER SESSION SET ...

【c语言】推断一个数是不是2的n次方

// 推断一个数是不是2的n次方 #include void judge_n(int a) { int b = a - 1; if ((a & b) == 0) ...

Windows显示不了磁盘

ps:当我的磁盘插电脑上却显示不了磁盘信息.终于最后将我的200G资料,搞没了,也不能恢复了..刚刚磁盘显示了,为了让更多人能不走弯路,我结合了网络能让磁盘显示的几个经验,也便大家方便参考...   ...

eclipse自定义new建

Window->Perspective->Customize Perspective->Shortcuts   找到适合的选中然后OK即可

docker知识点杂记

最近重新梳理了一下docker的一些基本知识,简单做了下总结.以后会逐步补充. 1.查看系统内核版本,需要3.10以上 $ uname -r 2.下载docker 说明:centos安装docker比 ...

HTTP Status 405 - HTTP method POST is not supported by this URL

出现这个问题, 1.在servlet中没有调用post()方法引起的 2.在serlvet中跳转没有用外跳(response.sendRedirect()) 我的是因为第一种,是没有写dopost() ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个完整的示例代码,包括注册和注销全局热键: ```cpp #include <iostream> #include <thread> #include <windows.h> using namespace std; void getInput() { string text; while (true) { getline(cin, text); if (text == "你好") { // 注册全局热键 if (!RegisterHotKey(NULL, 1, MOD_CONTROL | MOD_SHIFT, 'H')) { cout << "注册全局热键失败" << endl; } else { cout << "注册全局热键成功" << endl; } } else if (text == "大家好") { // 注销全局热键 if (!UnregisterHotKey(NULL, 1)) { cout << "注销全局热键失败" << endl; } else { cout << "注销全局热键成功" << endl; } } } } int main() { // 注册全局热键时需要使用消息循环,所以这里需要创建一个窗口 HWND hwnd = CreateWindow("STATIC", "GlobalHotkeyWindow", WS_VISIBLE, 0, 0, 0, 0, NULL, NULL, NULL, NULL); if (!hwnd) { cout << "创建窗口失败" << endl; return 1; } // 启动获取输入的线程 thread inputThread(getInput); // 消息循环,用于接收全局热键事件 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { if (msg.message == WM_HOTKEY) { cout << "收到全局热键事件" << endl; } } // 关闭线程 inputThread.join(); return 0; } ``` 在这个示例中,我们使用了`RegisterHotKey`和`UnregisterHotKey`函数来注册和注销全局热键。这两个函数都需要一个窗口句柄作为参数,所以我们需要在程序中创建一个窗口。 当我们注册热键时,需要指定热键的标识符、热键的组合键和热键的虚拟键码。在这个示例中,我们使用了`MOD_CONTROL`和`MOD_SHIFT`作为组合键,`'H'`作为虚拟键码,标识符为`1`。 当我们接收到全局热键事件时,会收到一个Windows消息`WM_HOTKEY`。在消息循环中,我们可以根据消息类型进行相应的操作,如在控制台中输出一些信息。 这个示例中只是演示了如何注册和注销全局热键,实际应用中可能需要根据具体需求进行一些调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值