试试看看是不是你要的:'窗体: Option Explicit Private Sub Form_Load() Call Hook End SubPrivate Sub Form_Unload(Cancel As Integer) Call ReleaseHook End Sub '在模块中: Option ExplicitPrivate Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Type PKBDLLHOOKSTRUCT VKCode As Long scanCode As Long flags As Long time As Long dwExtraInfo As Long End Type Private Const WH_KEYBOARD_LL = 13 Private Const HC_ACTION = 0 Private Const WM_KEYDOWN = &H100 Private Const VK_SNAPSHOT = &H2C Private PrevHook As LongPublic Function LowLevelKeyboardProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If ncode = HC_ACTION Then If wParam = WM_KEYDOWN Then
Dim p As PKBDLLHOOKSTRUCT CopyMemory p, ByVal lParam, Len(p)
If p.VKCode = VK_SNAPSHOT Then LowLevelKeyboardProc = -1 Exit Function End If End If End If
CallNextHookEx WH_KEYBOARD_LL, ncode, wParam, lParam End FunctionPublic Sub Hook() PrevHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0) End SubPublic Sub ReleaseHook() Call UnhookWindowsHookEx(PrevHook) End Sub
上面的代码运行时提示: Addressof 使用无效,请教怎么处理?谢谢。
先得到PrintScreen键的键值。然后调用API就可以啦
添加一个标准模块,把'在模块中: Option Explicit ..... Public Sub ReleaseHook() Call UnhookWindowsHookEx(PrevHook) End Sub这段代码粘到模块里去,不能放在窗体模块里
处理其他键(比如Tab,Up,Right,Down,Left等):...... Private Const VK_TAB = &H9 Private Const VK_UP = &H26 Private Const VK_RIGHT = &H27 Private Const VK_DOWN = &H28 Private Const VK_LEFT = &H25 ...... Public Function LowLevelKeyboardProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If ncode = HC_ACTION Then If wParam = WM_KEYDOWN Then
Dim p As PKBDLLHOOKSTRUCT CopyMemory p, ByVal lParam, Len(p)
Select Case p.VKCode Case VK_SNAPSHOT LowLevelKeyboardProc = -1 Exit Function Case VK_TAB MsgBox "处理TAB键!" Case VK_UP MsgBox "处理UP键!" Case VK_RIGHT MsgBox "处理Right键!" Case VK_DOWN MsgBox "处理Down键!" Case VK_LEFT MsgBox "处理Left键!" Case Else CallNextHookEx WH_KEYBOARD_LL, ncode, wParam, lParam End Select End If End If
窗体上的代码只有这些(其他的放到模块里去哦):'窗体: Option Explicit Private Sub Form_Load() Call Hook End SubPrivate Sub Form_Unload(Cancel As Integer) Call ReleaseHook End Sub
Option Explicit
Private Sub Form_Load()
Call Hook
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call ReleaseHook
End Sub
'在模块中:
Option ExplicitPrivate Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Type PKBDLLHOOKSTRUCT
VKCode As Long
scanCode As Long
flags As Long
time As Long
dwExtraInfo As Long
End Type
Private Const WH_KEYBOARD_LL = 13
Private Const HC_ACTION = 0
Private Const WM_KEYDOWN = &H100
Private Const VK_SNAPSHOT = &H2C
Private PrevHook As LongPublic Function LowLevelKeyboardProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If ncode = HC_ACTION Then
If wParam = WM_KEYDOWN Then
Dim p As PKBDLLHOOKSTRUCT
CopyMemory p, ByVal lParam, Len(p)
If p.VKCode = VK_SNAPSHOT Then
LowLevelKeyboardProc = -1
Exit Function
End If End If
End If
CallNextHookEx WH_KEYBOARD_LL, ncode, wParam, lParam
End FunctionPublic Sub Hook()
PrevHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
End SubPublic Sub ReleaseHook()
Call UnhookWindowsHookEx(PrevHook)
End Sub
Option Explicit
.....
Public Sub ReleaseHook()
Call UnhookWindowsHookEx(PrevHook)
End Sub这段代码粘到模块里去,不能放在窗体模块里
Private Const VK_TAB = &H9
Private Const VK_UP = &H26
Private Const VK_RIGHT = &H27
Private Const VK_DOWN = &H28
Private Const VK_LEFT = &H25
......
Public Function LowLevelKeyboardProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If ncode = HC_ACTION Then
If wParam = WM_KEYDOWN Then
Dim p As PKBDLLHOOKSTRUCT
CopyMemory p, ByVal lParam, Len(p)
Select Case p.VKCode
Case VK_SNAPSHOT
LowLevelKeyboardProc = -1
Exit Function
Case VK_TAB
MsgBox "处理TAB键!"
Case VK_UP
MsgBox "处理UP键!"
Case VK_RIGHT
MsgBox "处理Right键!"
Case VK_DOWN
MsgBox "处理Down键!"
Case VK_LEFT
MsgBox "处理Left键!"
Case Else
CallNextHookEx WH_KEYBOARD_LL, ncode, wParam, lParam
End Select End If
End If
End Function
......
Option Explicit
Private Sub Form_Load()
Call Hook
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call ReleaseHook
End Sub