[英]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調用從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.