使用RegisterHotkey
的概念是,它會定義一組或單個按鍵的組合杠园,不管在哪個程序之中立肘,按下程序窗體有注冊的HotKey時彻况,系統(tǒng)會傳送WM_HOTKEY
的訊息給待接收該訊息的程序窗體,而該程序窗體接收到WM_HOTKEY
時晰赞,便可知道有本身Thread所定義的HotKey被按下稼病,於是可以從wParam
,lParam
來得知是哪一組HotKey被按下,從而執(zhí)行相應的操作.
函數(shù)聲明的定義如下:
RegisterHotKey(ByVal hwnd As Long ,ByVal idHotKey as Long,ByVal Modifiers As Long,ByVal uVirtKey As Long)
hwnd
//接收自定義熱鍵的窗口的HWND
idHotKey
//id為你自己定義的一個ID值對一個線程來講其值必需在0x0000 - 0xBFFF范圍之內(nèi),十進制為0~49151, 對DLL來講其值必需在0xC000 - 0xFFFF 范圍之內(nèi),十進制為49152~65535,在同一進程內(nèi)該值必須唯一參數(shù) fsModifiers指明與熱鍵聯(lián)合使用按鍵
Modifiers
// 指明與熱鍵聯(lián)合使用按鍵(ALT,SHIFT,CTR的組合)如不需可置空
可取值為:MOD_ALT
, MOD_CONTROL
, MOD_WIN
, MOD_SHIFT
參數(shù)
或數(shù)字0為無組合鍵,1為Alt掖鱼,2為Control然走,4為Shift,8為Windows
uVirtKey
//自定義的虛擬按鍵碼
WM_HOTKEY 叁數(shù)傳遞為
idHotKey => wParam;
Modifiers => (UINT) LOWORD(lParam);
uVirtKey = >(UINT) HIWORD(lParam);
所以戏挡,除設定RegisterHotkey
外芍瑞,另要使用SubClassing的技巧才會得知HotKey被按
下;最後褐墅,程序結(jié)束前要使用UnRegisterHotkey
將HotKey的定義取消掉拆檬。切記,一定要有用有還!!!
以下demo 檢測按鍵 F1 每次按下則打開系統(tǒng)計算器
窗體設計如下
模塊 .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.hword = uVirtKey Then
Shell "calc" '此處為接收到熱鍵后需執(zhí)行的操作
End If
End If
End If
'將之送往原來的Window Procedure
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
窗體代碼 .frm
Option Explicit
Private Sub reg_Click()'注冊按鈕
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
uVirtKey = vbKeyF1
ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
End Sub
Private Sub unReg_Click()'銷毀按鈕
Dim ret As Long
'取消Message的截取,而使之又只送往原來的Window Procedure
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
Call UnregisterHotKey(Me.hwnd, uVirtKey)
End Sub