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执行关机?的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL宏的快捷键可以使用一个单键吗 F1什么的不用的?

使用全局热键调用 powershell 函数

vc中应该如何向窗口发送组合键消息

C++ Win32 监听全局键绑定

在可可应用程序和键盘布局中预定义全局热键

在 .NET 中注册热键 - 三/四键组合