'
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private 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
Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fskey_Modifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
Const WM_HOTKEY = &H312
Const MOD_ALT = &H1
Const MOD_CONTROL = &H2
Const MOD_SHIFT = &H4
Const GWL_WNDPROC = (-4)
Dim key_preWinProc As Long
Dim key_Modifiers As Long, key_uVirtKey As Long, key_idHotKey As Long
Dim key_IsWinAddress As Boolean
Function keyWndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HOTKEY Then
Select Case wParam
Case 1 '向左所执行的操作
MsgBox "左" '****************************************执行操作
Case 2 '向上所执行的操作
MsgBox "上" '****************************************执行操作
Case 3 '向右所执行的操作
MsgBox "右" '****************************************执行操作
Case 4 '想下所执行的操作
MsgBox "下" '****************************************执行操作
End Select
End If
keyWndproc = CallWindowProc(key_preWinProc, hwnd, Msg, wParam, lParam)
End Function
Function SetHotkey(ByVal KeyId As Long, ByVal KeyAss0 As String, ByVal Action As String, ByVal Wnd As Long)
Dim KeyAss1 As Long
Dim KeyAss2 As String
Dim i As Long
i = InStr(1, KeyAss0, ",")
If i = 0 Then
KeyAss1 = Val(KeyAss0)
KeyAss2 = ""
Else
KeyAss1 = Right(KeyAss0, Len(KeyAss0) - i)
KeyAss2 = Left(KeyAss0, i - 1)
End If
key_idHotKey = 0
key_Modifiers = 0
key_uVirtKey = 0
If key_IsWinAddress = False Then
key_preWinProc = GetWindowLong(Wnd, GWL_WNDPROC)
SetWindowLong Wnd, GWL_WNDPROC, AddressOf keyWndproc
End If
key_idHotKey = KeyId
Select Case Action
Case "Add"
If KeyAss2 = "Ctrl" Then key_Modifiers = MOD_CONTROL
If KeyAss2 = "Alt" Then key_Modifiers = MOD_ALT
If KeyAss2 = "Shift" Then key_Modifiers = MOD_SHIFT
If KeyAss2 = "Ctrl+Alt" Then key_Modifiers = MOD_CONTROL + MOD_ALT
If KeyAss2 = "Ctrl+Shift" Then key_Modifiers = MOD_CONTROL + MOD_SHIFT
If KeyAss2 = "Ctrl+Alt+Shift" Then key_Modifiers = MOD_CONTROL + MOD_ALT + MOD_SHIFT
If KeyAss2 = "Shift+Alt" Then key_Modifiers = MOD_SHIFT + MOD_ALT
key_uVirtKey = Val(KeyAss1)
RegisterHotKey Wnd, key_idHotKey, key_Modifiers, key_uVirtKey
key_IsWinAddress = True
Case "Del"
SetWindowLong Wnd, GWL_WNDPROC, key_preWinProc
UnregisterHotKey Wnd, key_uVirtKey
key_IsWinAddress = False
End Select
End Function
'窗体
Private Sub Form_Load()
SetHotkey 1, "37", "Add", Form1.hwnd
SetHotkey 2, "38", "Add", Form1.hwnd
SetHotkey 3, "39", "Add", Form1.hwnd
SetHotkey 4, "40", "Add", Form1.hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetHotkey 1, "", "Del", Form1.hwnd
SetHotkey 2, "", "Del", Form1.hwnd
SetHotkey 3, "", "Del", Form1.hwnd
SetHotkey 4, "", "Del", Form1.hwnd
End Sub