Qt全局熱鍵(windows篇)

本站全部文章由本站和原做者保留一切權力,僅在保留本版權信息、原文連接、原文做者的狀況下容許轉載,轉載請勿刪改原文內容, 並不得用於商業用途。 謝謝合做。 


Qt對於系統底層,一直沒有很好的支持,例如串口並口通訊,還有咱們常常都會用到的全局熱鍵,等等。既然Qt可能出於某種緣由,不對這些進行支持,咱們就只能本身寫代碼,調用系統相關的API了。

注意,這個是Windows篇,就說明這些代碼只支持windows系統。同時,也說明確定還有其餘平臺的要寫。不過要等O(∩_∩)O~

在Qt要調用Windows的API其實很簡單,只要在須要用到的頭文件中添加#include <windows.h>便可。不過要注意,Qt僅支持win32的API,像MFC之類的是不支持的。

想要在Qt裏使用全局熱鍵,最好的辦法是重載QApplication裏的winEventFilter函數。這個函數是用來響應Windows系統信息的。其函數原型爲virtual bool winEventFilter(MSG *msg, long *result)。當msg指針中的message(MSG結構中的一個元素)爲WM_HOTKEY類型時,就是用戶激發了熱鍵。整個過程和在VC的消息響應機制很相似,只不過換成了Qt而已。

而若是咱們想要添加本身的全局熱鍵,只須要使用RegisterHotKey函數便可。其函數原型爲:

BOOL RegisterHotKey( HWND hWnd,     int id,     UINT fsModifiers,     UINT vk );

HWND類型是Windows中的窗口句柄類型,在Qt中,QWidget及其子類都可使用winId()函數獲得。

第二個參數,是一個原子操做類型,用ATOM GlobalAddAtom(LPCTSTR lpString )函數獲得。這也是一個Win32API,根據一個string參數能夠獲得一個惟一的值。使用完以後,必須使用GlobalDeleteAtom函數刪除掉整個ATOM。其函數原型爲ATOM GlobalDeleteAtom( ATOM nAtom )。

後面兩個參數,一個是修飾鍵,一個是普通按鍵。例如,假設咱們想註冊Ctrl+F4這個熱鍵組合,則fsModifiers就是MOD_CONTROL,而vk就是VK_F4。

若是註冊成功,就返回true,不然,返回false。

注意,使用完以後,要使用UnregisterHotKey函數註銷,不然你可能再也沒法註冊這個熱鍵了!除非重啓。其函數原型爲:BOOL UnregisterHotKey(HWND hWnd,     int id )。

ok,熱鍵註冊就完成了。當按下熱鍵後,咱們就會在QApplication裏的winEventFilter函數中收到一個msg。這個msg,前面也說過,咱們須要知道它的一個元素message是否是WM_HOTKEY。若是是,就證實咱們收到了Windows系統的熱鍵信息。在MSG結構中,咱們可能還須要理解的元素有兩個,分別是wParam和lParam。wParam是註冊熱鍵時所用的id,也就是ATOM(原子)。而lParam就是咱們的熱鍵了。其其實是一個32位的類型,前面16位表明普通按鍵,後16位表明的是修飾鍵。

至此,Qt在Windows下使用全局熱鍵就完成了。若是有興趣的朋友,還能夠本身嘗試一下,修改或直接本身寫一份代碼。

若有錯誤,敬請指正。

我把我寫的測試代碼放到CuteQt論壇,有興趣的朋友能夠去下載。

http://cuteqt.org/bbs/viewthread.php?tid=1641&extra=page%3D1
相關文章
相關標籤/搜索