Qt實現全域性熱鍵

2021-06-08 21:34:12 字數 1534 閱讀 7994

使用qt

方法實現全域性熱鍵有兩種方法,一種是使用第三方庫

libqxt

其中的qxtglobalshortcut

類;另一種是呼叫

windows的

api。本文主要使用第二種方法實現功能。在呼叫前需包含標頭檔案。

主要步驟有兩個:

1、使用

registerhotkey

函式註冊熱鍵;

2、使用事件全域性過濾其函式

wineventfilter

相應熱鍵;

第一步:如何註冊熱鍵

通過registerhotkey

函式可以新增自己的全域性熱鍵,函式原型為:

bool 

winapi 

registerhotkey(

__in_opt

hwnd hwnd,

__in

int 

id,__in

uint

fsmodifiers,

__in

uint

vk);

hwnd:

接收熱鍵產生wm_hotkey

訊息的視窗控制代碼。

在qt中使用

widget

中的winid()

可得到。

id:定義熱鍵的識別符號。呼叫執行緒中的其他熱鍵不能使用同樣的識別符號。應用功能程式必須定義乙個0

x0000-0xbfff範圍的值。乙個共享的

dll必須定義乙個範圍為0xc000-0xffff的值(

globaladdatom函式返回該範圍

)。為了避免與其他動態鏈結庫定義的熱鍵衝突,乙個dll

必須使用

globaladdatom

函式獲得熱鍵的識別符號。使用完之後,必須使用

globaldeleteatom

函式刪除掉

這個atom

,其函式原型為atom globaldeleteatom( atom natom )

。fsmodifoers:

定義為了產生wm_hotkey

訊息而必須與由

nvirtkey

引數定義的鍵一起按下的鍵。

(mod_alt

,mod_control

,mod_shift

等)。

nvirtkey:(

vk_f1,

vk_f2,『a

』,『s

』等)。

第二步:如何響應熱鍵

qt通過過載

裡的wineventfilter

函式,這個函式是用來響應

windows系統訊息的,函式原型為

virtual bool wineventfilter(msg *msg, long *result)

。當msg

指標中的

message

(msg

結構中的乙個元素)為

wm_hotkey

型別時,就是使用者激發了熱鍵

。第三步:在析構函式中登出atom

和熱鍵。

QT5 全域性熱鍵

後來在網上找,找到了乙個站在巨人肩膀上的博主,分享的乙個全域性熱鍵的使用類。完整的demo專案的github鏈結如下 使用方法如下 初始化變數,第乙個引數,熱鍵的快捷鍵組合,第二個引數為物件 shortcut new myglobalshortcut ctrl shift y realmoniter...

使用鉤子技術實現QT中的全域性熱鍵

qt中的窗體只有獲得焦點的情況下,才會響應按鍵或滑鼠事件 mfc的窗體是否也是如此?但是在實際開發過程中,我們常常需要的是即使某些窗體處於失去焦點狀態時,也能響應相應的鍵盤或者滑鼠事件。那麼,應該如何實現呢?筆者在遇到這種情況時,首先考慮的還是使用事件監控的方式,但筆者在實際使用中發現,該種方式不是...

實現gnome桌面的全域性熱鍵

gtk 2.0 沒有提供全域性熱鍵的功能,而需要使用gconf和 metacity才能得到該功能。不過有個叫 mikkel kamstrup erlandsen 的人寫了乙個 libgtkhotkey 可以提供該功能,而且是跨平台的。在fedora系統上,安裝libgtkhotkey su yum ...