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下使用全局熱鍵就完成了。如果有興趣的朋友,還可以自己嘗試一下,修改或直接自己寫一份代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM