程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC系統熱鍵的注冊

VC系統熱鍵的注冊

編輯:vc教程

今天在寫程序時想用一個系統熱鍵,就像QQ一樣最小化以後也能照樣響應指定的快捷鍵。盡管我知道VC中肯定有現成的方法,但我畢竟沒有實現過,於是研究了一番,很快就找到了解決方法。

使用系統熱鍵可以這麼進行,假設我們在 CTestHotkeyDlg 這個類進行熱鍵測試。

A. 首先是注冊系統熱鍵 RegisterHotKey

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

 hWnd : 指定響應該熱鍵的窗體
 id : 指定響應該事件的 id
 fsModifIErs : 指定組合鍵。這個值可以由 MOD_ALT MOD_CONTROL MOD_SHIFT MOD_WIN 中的一個或幾個組成。
 vk : 指定熱鍵的虛擬鍵值。如 'A'

例如在本例中注冊一個 Ctrl+Alt+Q 的熱鍵。在 CTestHotkeyDlg特定的地方中調用:
RegisterHotKey(this->m_hWnd, 0x1998, MOD_CTRL | MOD_ALT, 'Q');

B. 接著響應並實現系統熱鍵消息 WM_HOTKEY

添加消息映射 ON_MESSAGE(WM_HOTKEY,OnHotKey) 並實現函數 OnHotKey

LRESULT CHotKeyTestDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
{
   MessageBox("You press Ctrl+Alt+Q");
   return 0;
}

C. 最後,可別忘了在程序結束時撤銷注冊的熱鍵 UnRegisterHotKey

void CHotKeyTestDlg::OnDestroy()
{
   CDialog::OnDestroy();
   UnregisterHotKey(this->m_hWnd,1000);
}

到此系統熱鍵的工作全部完成。

 ——————————————————————————————————————————————————

最好不要直接用0x1998, 0x1220等數,以防止熱鍵沖突
ATOM m_atom1,m_atom2;    //保存全局原子

ATOM TmpID=GlobalFindAtom("my first hotkey");
if TmpID=0 then //查找全局原子.如果返回值不為0,則說明這個全局原子已經被注冊;


m_atom1 = GlobalAddAtom("my first hotkey");
m_atom2 = GlobalAddAtom("my second hotkey");
BOOL m_isKeyRegistered;
m_isKeyRegistered = RegisterHotKey(GetSafeHwnd(),m_atom1, MOD_CONTROL|MOD_SHIFT, 0x4e);
ASSERT(m_isKeyRegistered != FALSE);     //調試時用(當前熱鍵已經被注冊時會返回失敗)
// 注冊第二個始終不行
if(RegisterHotKey(GetSafeHwnd(), m_atom2, MOD_CONTROL, 0x4d) == FALSE)
{
MessageBox("error", NULL, MB_OK);
}

在不需要熱鍵時,比如程序退出時
GlobalDeleteAtom(m_atom1);
GlobalDeleteAtom(m_atom2);

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