簡體   English   中英

在Qt和Mac OS X下注冊Global Hotkey

[英]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-ccocoa來完成我正在尋找的東西? 如果我錯過了什么,請引導我走向正確的方向。

提前致謝!


對於那些尋求更多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,或者初始化和變體。 調用它應該是直接的“新”。

防爆

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM