RegisterHotKey的具體使用方法


使用方法如下:

BOOL   RegisterHotKey(
HWND   hWnd,         //響應該熱鍵的窗口句柄
Int   id,                       //該熱鍵的唯一標識
UINT   fsModifiers,   //該熱鍵的輔助按鍵
UINT   vk                 //該熱鍵的鍵值
);  

為了得到唯一標識,我們還將用到另一個API函數  

ATOM   GlobalAddAtom(

LPCTSTR   lpString   //自己設定的一個字符串

);

因為我們還要在程序退出的時候,消除這個熱鍵,   所以需要聲明一個全局變量:  

HotKeyId:   Integer;  

   

第一步:  

在窗口的create事件中,加入以下代碼  

HotKeyId   :=   GlobalAddAtom(‘MyHotKey’)   -   $C000;
注:   HotKeyId的合法取之范圍是0x0000到0xBFFF之間,   GlobalAddAtom函數得到的值
在0xC000到0xFFFF之間,所以減掉0xC000來滿足調用要求。

第二步:  

在上面的代碼下面加入:  

RegisterHotKey(Handle,   hotkeyid,   MOD_ALT,   VK_F8);    

熱鍵的輔助按鍵包括Mod_Ctrl   、Mod_Alt、Mod_Shift,對於Windows兼容鍵盤還支持Windows
鍵,即其鍵面上有Windows標志的那個鍵,其值為Mod_win。

上面   的代碼注冊了一個熱鍵:ALT+F8。當然如果你希望象TAKEIT那樣,只用F8,   就這么寫:

RegisterHotKey(Handle,   hotkeyid,   0,   VK_F8);    

注:handle是一個特殊的變量,它表示當前窗口的句柄。

這個函數你應該能句舉一反三了吧。

原理:

一旦熱鍵設置成功,在程序應用過程中如果有相應的鍵被按下,Windows系統都會給你的應
用程序發送一個消息WM_HOTKEY,不管你的應用程序是否為當前活動的。其中WM_HOTKEY消
息的格式為:    

idHotKey   =   (int)   wParam;   //   該參數在設置系統級的熱鍵有用,一般不予使用
fuModifiers   =   (UINT)   LOWORD(lParam);     //熱鍵的輔助按鍵
uVirtKey   =   (UINT)   HIWORD(lParam);   //熱鍵的鍵值  

   

第三步:  

注冊了熱鍵,就該寫下響應代碼了。  

首先,在程序頭部分的private段中加入聲明   (作用是聲明這個過程,和聲明變量類似。
關於如何聲明函數、過程,請請參考各自的幫助文件或其它資料):  

procedure   HotKeyDown(var   Msg:   Tmessage);   message   WM_HOTKEY;  

   

然后在程序中加入如下代碼:  

procedure   Tfmain.HotKeyDown(var   Msg:   Tmessage);  

begin  

if   (Msg.LparamLo   =   MOD_ALT)   AND   Msg.LParamHi   =   VK_F8   then   //   假設熱鍵為ALT+F8  

begin  

end;  

最后一步:  

在窗口的close事件中加入  

UnRegisterHotKey(handle,   HotKeyId);   //注銷HotKey,   釋放資源

 

 

 

VB中用API函數RegisterHotKey注冊系統熱鍵
使用RegisterHotkey的概念是,它會定義一組或單個按鍵的組合,不管在哪個程序之中,按下程序窗體有注冊的HotKey時,系統會傳送WM_HOTKEY 的訊息給待接收該訊息的程序窗體,而該程序窗體接收到WM_HOTKEY時,便可知道有本身Thread所定義的HotKey被按下,於是可以從wParam, lParam來得知是哪一組HotKey被按下,從而執行相應的操作.

函數聲明的定義如下:
RegisterHotKey(
   ByVal hwnd As Long ,     //接收自定義熱鍵的窗口的HWND
   ByVal idHotKey as Long,   //id為你自己定義的一個ID值對一個線程來講其值必需在0x0000 - 0xBFFF范圍之內,十進制為0~49151, 對DLL來講其值必需在0xC000 - 0xFFFF 范圍之內,十進制為49152~65535,在同一進程內該值必須唯一參數 fsModifiers指明與熱鍵聯合使用按鍵
   ByVal Modifiers As Long,   // 指明與熱鍵聯合使用按鍵(ALT,SHIFT,CTR的組合)如不需可置空
,可取值為:MOD_ALT, MOD_CONTROL, MOD_WIN, MOD_SHIFT參數,或數字0為無,1為Alt,2為Control,4為Shift,8為Windows

   ByVal uVirtKey As Long   //定主你自定的HOTKEY的虛擬按鍵碼
   )

WM_HOTKEY 叄數的定義
idHotKey = wParam;          
Modifiers = (UINT) LOWORD(lParam);
uVirtKey = (UINT) HIWORD(lParam);  

所以了,除了設定RegisterHotkey外,另要使用SubClassing的技巧才會得知HotKey被按
下;最後,程序結束前要使用UnRegisterHotkey將HotKey的定義取消掉。切記,一定要有用有還!!!

以下程序功能是:不管在哪個程序中,只要按下ALT-SHIFT-G 便執行NotePad。
'以下在.Bas
Option Explicit

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long

Public Const WM_HOTKEY = &H312
Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
Public Const GWL_WNDPROC = (-4)

Public preWinProc As Long
Public Modifiers As Long, uVirtKey As Long, idHotKey As Long

Private Type taLong
   ll As Long
End Type
Private Type t2Int
   lWord As Integer
   hword As Integer
End Type
Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
                 ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HOTKEY Then
   If wParam = idHotKey Then
     Dim lp As taLong, i2 As t2Int
     lp.ll = lParam
     LSet i2 = lp
     If (i2.lWord = Modifiers) And i2.hword = uVirtKey Then
       ‘此處為接收到熱鍵后需執行的操作
     End If
   End If
End If
'將之送往原來的Window Procedure
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function

'以下在 Form
Sub Form_Load()
Dim ret As Long
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
idHotKey = 1 'in the range &h0000 through &hBFFF
Modifiers = MOD_ALT + MOD_SHIFT
uVirtKey = vbKeyG
ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim ret As Long
'取消Message的截取,而使之又只送往原來的Window Procedure
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
Call UnregisterHotKey(Me.hwnd, uVirtKey)
End Sub


免責聲明!

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



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