在Qt和Mac OS X下注册Global Hotkey

时间:2015-11-30 16:37:02

标签: c++ macos qt cocoa

阅读了各种帖子和帖子,这些帖子和帖子都没有我需要你的帮助。

我有一个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-ccocoa来完成我想要的内容? 如果我可能遗漏了某些东西,请引导我走向正确的方向。

提前致谢!

对于那些寻求更多Qt方式的人,请检查以下存储库: https://github.com/ddqd/qxtglobalshortcut5

它使用过时的 qxt库,但让它再次运行。 该人测试它直到Qt 5.4,我们在Qt 5.5下成功使用它。

1 个答案:

答案 0 :(得分:3)

这可能就是你要找的东西 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,或者初始化和变体。通过“新”来调用它应该是直截了当的。

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++

相关问题