阅读了各种帖子和线索后,我无处可寻,需要您的帮助。
我确实有一个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调用从Apple看这个示例,我认为它将为您指明正确的方向。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和Variants。调用它应该直接带有“ new”。
前任的
#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++
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句