在Windows操作系統(tǒng)下的Qt全局熱鍵
Qt對于系統(tǒng)底層,一直沒有很好的支持,例如串口并口通信,還有我們經(jīng)常都會(huì)用到的全局熱鍵,等等。既然Qt可能出于某種原因,不對這些進(jìn)行支持,我們就只能自己寫代碼,調(diào)用系統(tǒng)相關(guān)的API了。
注意,這個(gè)是Windows篇,就說明這些代碼只支持windows系統(tǒng)。同時(shí),也說明肯定還有其他平臺(tái)的要寫。
在Qt要調(diào)用Windows的API其實(shí)很簡單,只要在需要用到的頭文件中添加#include <windows.h>即可。不過要注意,Qt僅支持win32的API,像MFC之類的是不支持的。
想要在Qt里使用全局熱鍵,最好的辦法是重載QApplication里的winEventFilter函數(shù)。這個(gè)函數(shù)是用來響應(yīng)Windows系統(tǒng)信息的。其函數(shù)原型為virtual bool winEventFilter(MSG *msg, long *result)。當(dāng)msg指針中的message(MSG結(jié)構(gòu)中的一個(gè)元素)為WM_HOTKEY類型時(shí),就是用戶激發(fā)了熱鍵。整個(gè)過程和在VC的消息響應(yīng)機(jī)制很類似,只不過換成了Qt而已。
而如果我們想要添加自己的全局熱鍵,只需要使用RegisterHotKey函數(shù)即可。其函數(shù)原型為:
- BOOL RegisterHotKey( HWND hWnd, int id, UINT fsModifiers, UINT vk );
HWND類型是Windows中的窗口句柄類型,在Qt中,QWidget及其子類均可使用winId()函數(shù)得到。
第二個(gè)參數(shù),是一個(gè)原子操作類型,用ATOM GlobalAddAtom(LPCTSTR lpString )函數(shù)得到。這也是一個(gè)Win32API,根據(jù)一個(gè)string參數(shù)可以得到一個(gè)唯一的值。使用完之后,必須使用GlobalDeleteAtom函數(shù)刪除掉整個(gè)ATOM。其函數(shù)原型為
- ATOM GlobalDeleteAtom( ATOM nAtom )
后面兩個(gè)參數(shù),一個(gè)是修飾鍵,一個(gè)是普通按鍵。例如,假設(shè)我們想注冊Ctrl+F4這個(gè)熱鍵組合,則fsModifiers就是MOD_CONTROL,而vk就是VK_F4。
如果注冊成功,就返回true,否則,返回false。
注意,使用完之后,要使用UnregisterHotKey函數(shù)注銷,否則你可能再也無法注冊這個(gè)熱鍵了!除非重啟。其函數(shù)原型為:
- BOOL UnregisterHotKey(HWND hWnd, int id )
ok,熱鍵注冊就完成了。當(dāng)按下熱鍵后,我們就會(huì)在QApplication里的winEventFilter函數(shù)中收到一個(gè)msg。這個(gè)msg,前面也說過,我們需要知道它的一個(gè)元素message是不是WM_HOTKEY。如果是,就證明我們收到了Windows系統(tǒng)的熱鍵信息。在MSG結(jié)構(gòu)中,我們可能還需要理解的元素有兩個(gè),分別是wParam和lParam。wParam是注冊熱鍵時(shí)所用的id,也就是ATOM(原子)。而lParam就是我們的熱鍵了。其實(shí)際上是一個(gè)32位的類型,前面16位代表普通按鍵,后16位代表的是修飾鍵。
至此,Qt在Windows下使用全局熱鍵就完成了。如果有興趣的朋友,還可以自己嘗試一下,修改或直接自己寫一份代碼。
【編輯推薦】