本站所有文章由本站和原作者保留一切權力,僅在保留本著作權資訊、原文連結、原文作者的情況下允許轉載,轉載請勿刪改原文內容, 並不得用於商業用途。 謝謝合作。
原文連結: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