在Qt和Mac OS X下注册全局热键
Register Global Hotkey under Qt and Mac OS X
在阅读了各种各样的帖子和线程后,我需要你的帮助。
我确实有一个适用于Mac OS X的Qt应用程序,在某个使用点上,它将处于后台,而不是活动状态。在这种情况下,我想添加一个全局热键,以便用户可以通过单击预定义的热键轻松打开或关闭某些功能。当应用程序处于后台且未聚焦时,以下内容不起作用。
QShortcut *shortcut = new QShortcut(QKeySequence(Qt::Key_F12), parent);
shortcut->setContext(Qt::ApplicationShortcut);
到目前为止,我发现Qxt
对于Qt 5.5来说已经过时了。然后是DDHotkey,它需要一个特定的编译器,由于各种原因我们不能使用它。最后,我找到了添加一个全局AppleScript
的解决方案,它注册一个事件,这也是我想要的。
tell application "System Events" to tell process "myApp"
click menu item "myButton" of menu 1 of menu bar item "Menu" of menu bar 1
end tell
有没有一种方法可以使用objective-c
或cocoa
来实现我想要的目标?如果我可能错过了什么,请引导我朝正确的方向走。
提前感谢!
对于那些寻求更多Qt方式的人,请查看以下存储库:https://github.com/ddqd/qxtglobalshortcut5
它使用了过时的qxt
库,但使其重新工作。该人员测试了它,直到Qt 5.4,我们在Qt 5.5下成功使用了它。
这可能是您想要的https://github.com/jaz303/JFHotkeyManager
你也可以看看苹果的这个例子,使用RegisterEventHotKey API调用,我认为这将为你指明正确的方向。https://developer.apple.com/library/prerelease/mac/samplecode/FunkyOverlayWindow/Listings/FunkyOverlayWindow_OverlayWindow_m.html#//apple_ref/doc/uid/DTS10000391-FunkyOverlayWindow_OverlayWindow_m-DontLinkElementID_8
或者你可以试试这个代码
#import <Carbon/Carbon.h>
EventHandlerUPP hotKeyFunction;
pascal OSStatus hotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent, void *userData)
{
Notify *obj = userData;
[obj foo];
return noErr;
}
@implementation Notify
- (id)init
{
self = [super init];
if (self) {
//handler
hotKeyFunction = NewEventHandlerUPP(hotKeyHandler);
EventTypeSpec eventType;
eventType.eventClass = kEventClassKeyboard;
eventType.eventKind = kEventHotKeyReleased;
InstallApplicationEventHandler(hotKeyFunction,1,&eventType,self,NULL);
//hotkey
UInt32 keyCode = 80; //F19
EventHotKeyRef theRef = NULL;
EventHotKeyID keyID;
keyID.signature = 'FOO '; //arbitrary string
keyID.id = 1;
RegisterEventHotKey(keyCode,0,keyID,GetApplicationEventTarget(),0,&theRef);
}
return self;
}
- (void)foo
{
}
@end
和标题
#include "notify.mm"
@interface Notify
- (id)init;
- (void)foo;
@end
简单地说,这只是一个带有方法和构造函数的对象,在objective-c中,这被称为init或initialize和variations。称之为"新"应该直截了当。
E.x
#include "notify.h"
int main(){
Notify* object = new Notify();
}
然而,还需要对Objective-C有一些基本的了解。在我看来,这主要是语法上的差异。但我自己不是Objective-C专家。不管怎样,有很多方法可以解决这个问题,这可能不是最好的主意。您也可以从您的C++类内部调用Objective-C代码。看看下面的链接,了解如何做到这一点。
https://el-tramo.be/blog/mixing-cocoa-and-qt/
https://github.com/remko/mixing-cocoa-and-qt/
http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- 无法将结构注册为增强几何体3D点
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何创建一个空的全局类并在启动时实例化它
- 如何使用AngelScript注册SFML Vector2运算符
- 内联函数中具有内部链接的全局变量
- 为什么虚函数不能是静态的和全局的?
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 在遍历处理程序的向量时注册和注销处理程序
- 有没有任务栏API可以立即应用注册表更改
- 使用QJsEngine在Qt中注册自定义类型
- 全局作用域中函数指针的赋值
- g++用户定义的动态链接库上的全局new和delete运算符
- 在命名空间中使用全局命名空间中的函数
- 在不禁用其密钥的情况下注册全局热键
- 在Qt和Mac OS X下注册全局热键
- 自注册全局对象
- 如何在单个全局数组中独立注册全局变量