VC 中如何实现全局热键,不要求用组合键,如单键F2执行关机?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC 中如何实现全局热键,不要求用组合键,如单键F2执行关机?相关的知识,希望对你有一定的参考价值。
如题
需要用到RegisterHotKey函数,注册热键。并增加对响应的消息处理功能。如果不需要组合键,RegisterHotKey的fsModifiers值可以选择MOD_KEYUP。 以下是前辈留下的资料,请参考:================================= BOOL RegisterHotKey(HWND hWnd , //指定接收WM_HOTKEY消息的窗体句柄
int id, //热键标识,同一调用线程内的不同热键标识不能相同,应用程序中的标识值在0x0000和0xbfff之间,DLL中的在0xc000和0xffff之间
UINT fsModifiers,//下列值的组合:MOD_ALT,MOD_CONTROL,MOD_SHIFT,MOD_WIN,MOD_KEYUP
UINT vk //按键的虚拟码
);
//在初始化的时候注册:
RegisterHotKey(m_hWnd,1688,MOD_SHIFT|MOD_CONTROL,‘A‘);
RegisterHotKey(m_hWnd,2688,MOD_SHIFT|MOD_CONTROL,‘a‘);
//表示按下Shift+Ctrl+A和Shift+Ctrl+a;
BOOL UnregisterHotKey(HWND hWnd, int id);
//添加WM_DESTROY消息时注销热键
CDialog::OnDestroy();
// TODO: Add your message handler code here
UnregisterHotKey(m_hWnd,1688);
UnregisterHotKey(m_hWnd,2688);
//添加消息函数
afx_msg LRESULT OnHotHey(WPARAM wParam,LPARAM lParam);
//实现
CWndsnapDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
if(wParam==1688||wParam=2688)
CDialog a;
a.DoModal();
if()
CDialog b;
b.DoModal();
//...
参考技术A API,钩子函数
C ++ / Qt全局热键[重复]
【中文标题】C ++ / Qt全局热键[重复]【英文标题】:C++/Qt Global Hotkeys [duplicate] 【发布时间】:2016-06-04 12:29:28 【问题描述】:我正在开发一个应用程序,我需要在后台运行它并在按下某个按钮组合时运行一个函数。我有点理解这需要特定于平台的 API 调用(WIN32、X11 等),但我真的不知道如何开始。另外,有没有多平台的方法来实现这一点?我真的需要它才能在 Windows、Linux 和 OSX 上工作。
【问题讨论】:
这就是你想要的吗? how-to-detect-global-key-sequence-press-in-qt?也许this 也值得一看。 @holzkohlengrill 是的。这似乎是我正在寻找的。这几天我一直在努力寻找这样的东西。但是,我找不到获取该库的方法。它只是将我重定向到 bitbucket.org @holzkohlengrill 我也刚刚注意到不再维护 Qxt。我将尝试使用您发布的第二个链接(该库最近一次更新是 21 天前,所以看起来很有希望)。 【参考方案1】:总结一下:
-
The Qt Event System 可能是一个选项(在系统/桌面管理员级别提供一些帮助)
Qxt Library(不再维护)
或者这个项目UGlobalHotkey
。 2. 似乎是迄今为止最好的选择。虽然它不再维护,但它目前适用于 Qt5。
【讨论】:
Qt 的事件系统(本身)不会解决问题,因为它只处理操作系统首先传递给它的事件......而操作系统不会(默认情况下) ) 将击键传递给其窗口当前没有焦点的应用程序。 我可以只包含Qxt或UGlobalHotkey的头文件吗?两者都展示了如何编译它,但没有展示如何包含它。另外,谢谢您的建议 看看他们的文档。只需将库添加到您的项目(qmake 文件)并使用他们的库。我只是随便取了一个example:包括,例子,……都在这里。【参考方案2】:http://amin-ahmadi.com/2015/11/14/how-to-use-system-wide-hotkeys-in-your-qt-application/ 展示了如何在 Qt 中使用 Windows API 的RegisterHotKey。
您需要热键的密钥代码。
【讨论】:
它工作正常,但菜单栏和其他东西将不再工作。 nativeEvent 将获取所有事件,而 Qt 不会接收它们。【参考方案3】:看看https://github.com/kwhat/libuiohook
它是一个可以轻松与 Qt 集成的 c 库。 允许全局键盘和鼠标事件侦听器。
或
https://github.com/Skycoder42/QHotkey
这是一个基于 Qt 的库,似乎得到了维护。
【讨论】:
以上是关于VC 中如何实现全局热键,不要求用组合键,如单键F2执行关机?的主要内容,如果未能解决你的问题,请参考以下文章