程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Windows RegisterHotKey編程實踐

Windows RegisterHotKey編程實踐

編輯:關於C語言
 

什麼是RegisterHotKey?

RegisterHotKey函數被用來定義一個系統范圍的熱鍵;那什麼是熱鍵,熱鍵即快捷鍵;至於什麼是快捷鍵,這裡就不進行掃盲了,你可以向度娘咨詢。

函數原型及參數說明

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

hWnd:當按下了定義的熱鍵時,會產生一個WM_HOTKEY的消息,而hWnd表示用來接收WM_HOTKEY消息的窗口句柄;如果這個參數為NULL,WM_HOTKEY消息就會扔進調用者線程的消息隊列中,進行消息循環,然後再被處理掉;

id:指定的熱鍵標識符;在調用者線程中,不允許有相同的熱鍵標識符。一個應用程序必須指定一個在0×0000到0xBFFF范圍之內的值;而對於一個共享的DLL來說,必須指定一個在0xC000到0xFFFF范圍之內的值。為了避免定義的熱鍵標識符和其它共享DLL定義的熱鍵標識符沖突了,共享DLL應該使用GlobalAddAtom函數來生成一個熱鍵標識符;

fsModifiers:定義為了產生WM_HOTKEY消息而必須與由vk參數定義的鍵一起按下的鍵;該參數可以指定以下值:

  1. MOD_ALT:表示按下鍵盤上的任意一個Alt鍵;
  2. MOD_CONTROL:表示按下鍵盤上的任意一個Control鍵;
  3. MOD_SHIFT:表示按下鍵盤上的任意一個Shift鍵;
  4. MOD_WIN:表示按下鍵盤上的任意一個Win鍵。

vk:表示熱鍵的虛擬鍵位碼。

返回值說明:當函數調用成功時,返回為非零值;當函數調用失敗時,返回值為0,可以調用GetLastError函數獲得錯誤碼。

編程實踐

創建一個簡單的MFC程序;添加一個按鈕,按鈕處理程序如下:

void CRegisterHotKeyDemoDlg::OnBnClickedOk(){
	// Get the hot key id
	m_iHotKeyId = GlobalAddAtom(wsHotKey) - 0xC000;
	if (m_iHotKeyId <= 0)
		return;

	// Register the hot key
	m_bRet = RegisterHotKey(m_hWnd, m_iHotKeyId, MOD_CONTROL, 0x46);
	if (!m_bRet)
		return;}

添加WM_HOTKEY事件的處理代碼:

void CRegisterHotKeyDemoDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2){
	// Handle the hot key message
	if (nHotKeyId == m_iHotKeyId)
	{
		MessageBox(L"This is a demo", L"RegisterHotKey");
	}

	CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2);}

在析構函數中添加釋放處理:

CRegisterHotKeyDemoDlg::~CRegisterHotKeyDemoDlg(){
	if (m_bRet)
	{
		UnregisterHotKey(m_hWnd, m_iHotKeyId);
		m_bRet = false;
	}

	if (m_iHotKeyId > 0)
	{
		GlobalDeleteAtom(m_iHotKeyId + 0xC000);
		m_iHotKeyId = 0;
	}}

(工程下載)

注意事項

在實際開發中,我們經常是使用GlobalAddAtom獲得一個id,所以,我們定義了一個全局的字符串變量:

const wchar_t *wsHotKey = L”HotKeyDemo”;

使用GlobalAddAtom獲得的id范圍是0xC000到0xFFFF,而應用程序要求id范圍為0×0000到0xBFFF,所以,使用GlobalAddAtom獲得的id減去0xC000就能得到一個在范圍為0×0000到0xBFFF之內的id。當使用GlobalAddAtom之後,必須對應的需要使用GlobalDeleteAtom刪除對應的id;同理,當使用RegisterHotKey注冊了一個熱鍵,程序退出時,也需要使用UnregisterHotKey注銷對應的熱鍵。

當某鍵被接下時,系統在所有的熱鍵中尋找匹配者。一旦找到一個匹配的熱鍵,系統將把WM_HOTKEY消息傳遞給登記了該熱鍵的線程的消息隊列。該消息被傳送到隊列頭部,因此它將在下一輪消息循環中被移去。該函數不能將熱鍵同其他線程創建的窗口關聯起來。

若為一熱鍵定義的擊鍵己被其他熱鍵所定義,則RegisterHotKey函數調用失敗。

若hWnd參數標識的窗口已用與id參數定義的相同的標識符登記了一個熱鍵,則參數fsModifiers和vk的新值將替代這些參數先前定義的值。

最後,感歎人生,為什麼有的時候不能做自己喜歡做的事情呢?

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved