用RegisterHotKey注冊系統熱鍵(ZZ)


用RegisterHotKey注冊系統熱鍵(ZZ)  

2011-01-07 15:06:52|  分類: C++ |  標簽: |字號 訂閱

 

函數功能:該函數定義一個系統范圍的熱鍵。
  函數原型:BOOL RegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk);
  參數:
  hWnd:接收熱鍵產生WM_HOTKEY消息的窗口句柄。若該參數NULL,傳遞給調用線程的WM_HOTKEY消息必須在消息循環中中進行處理。
  id:定義熱鍵的標識符。調用線程中的其他熱鍵不能使用同樣的標識符。應用功能程序必須定義一個0X0000-0xBFFF范圍的值。一個共享的動態鏈接庫(DLL)必須定義一個0xC000-0xFFFF范圍的值伯GlobalAddAtom函數返回該范圍)。為了避免與其他動態鏈接庫定義的熱鍵沖突,一個DLL必須使用GlobalAddAtom函數獲得熱鍵的標識符。
  fsModifoers:定義為了產生WM_HOTKEY消息而必須與由nVirtKey參數定義的鍵一起按下的鍵。該參數可以是如下值的組合:
  MOD_ALT:按下的可以是任一Alt鍵。MOD_CONTROL:按下的可以是任一Ctrl鍵。
  MOD_SHIFT:按下的可以是任一Shift鍵。
  MOD_WIN:按下的可以是任一Windows按鍵。這些鍵可以用Microsoft Windows日志記錄下來。
  MOD_NOREPEAT:Windows 7或者后續版本: 更改熱鍵行為,以便鍵盤自動重復不會產生多個熱鍵通知。
  vk:定義熱鍵的虛擬鍵碼。
  返回值:若函數調用成功,返回一個非O值。若函數調用失敗,則返回值為0。若要獲得更多的錯誤信息,可以調用GetLastError函數。
  備注:當某鍵被接下時,系統在所有的熱鍵中尋找匹配者。一旦找到一個匹配的熱鍵,系統將把WM_HOTKEY消息傳遞給登記了該熱鍵的線程的消息隊列。該消息被傳送到隊列頭部,因此它將在下一輪消息循環中被移去。該函數不能將熱鍵同其他線程創建的窗口關聯起來。
  若為一熱鍵定義的擊鍵己被其他熱鍵所定義,則RegisterHotKey函數調用失敗。
  若hWnd參數標識的窗口已用與id參數定義的相同的標識符登記了一個熱鍵,則參數fsModifiers和vk的新值將替代這些參數先前定義的值。
  Windows CE:Windows CE 2.0以上版本對於參數fsModifiers支持一個附加的標志位。叫做MOD_KEYUP。
  若設置MOD_KEYUP位,則當發生鍵被按下或被彈起的事件時,窗口將發送WM_HOTKEY消息。
  RegisterHotKey可以被用來在線程之間登記熱鍵。

 

上面只是一個注冊熱鍵的過程,那么熱鍵注冊成功后呢,當用戶按住熱鍵的時候,它就會產生WM_HOTKEY消息(也就是說時間到了,該執行代碼了),那么我們的還要處理這個消息來為自己所用,假如用戶按住熱鍵我打算讓他彈出個對話框,我們可以這樣處理這個消息,如果你用的是MFC設計軟件,那么你可以在 PreTranslateMessage(MSG* pMsg)函數中截獲WM_HOTKEY消息,代碼如下
  {
  // TODO: Add your specialized code here and/or call the base class
  switch(pMsg->message)
  {
  case WM_HOTKEY: //截獲這個消息來處理自己想要的結果
  {
  if (pMsg->wParam==(這里是你注冊時的熱鍵ID,也是唯一的))
  {
  MessageBox("Test is 成功");
  }
  break;
  }
  default:  //默認的處理
  break;
  }
  return CDialog::PreTranslateMessage(pMsg);
  }
  剩下的工作就是反注冊熱鍵(意思就是注銷這個熱鍵),在程序關閉的時候寫入下列代碼,我是在OnClose中寫的 ,你也可以在OnDestroy中寫,
  UnregisterHotKey(m_hWnd,(注冊時的ID)); //這個函數也是個API函數,第一個參數是說明你要注銷哪個窗口句柄的熱鍵,第二個參數說明是你開始注冊的唯一ID

接收熱鍵的方式(按照接收消息順序):

1、重載PreTranslateMessage

virtual BOOL PreTranslateMessage(MSG* pMsg);

switch(pMsg->message)
 {
 case WM_HOTKEY:
  MessageBox( _T("PreTranslateMessage 收到熱鍵消息"));

......

2、自定義接收消息

ON_MESSAGE( WM_HOTKEY, &CHotKeyDlg::OnGetHotMsg )

afx_msg HRESULT OnGetHotMsg( WPARAM wParam, LPARAM lParam );

3、重載DefWindowProc

virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);

switch(message )
 {
 case WM_HOTKEY:
  MessageBox( _T(" DefWindowProc 收到熱鍵消息"));


免責聲明!

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



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