老马~~~` 我在网上看到你说WH_KEYBOARD_LL 钩子不用DLL来完成,但是如果做成DLL 是不是这样啊 <br/> 一、新建一个ActiveX Dll工程,名字栏里取名为SysHook <br/>二、添加一个模块,取名为mHook,添加代码如下: <br/><br/>Option Explicit<br/><br/>Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long<br/>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<br/>Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long<br/>Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer<br/>Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)<br/><br/>Private Type PKBDLLHOOKSTRUCT<br/> VKCode As Long<br/> scanCode As Long<br/> flags As Long<br/> time As Long<br/> dwExtraInfo As Long<br/>End Type<br/><br/>Private Const WH_KEYBOARD_LL = 13<br/>Private Const HC_ACTION = 0<br/>Private Const WM_KEYDOWN = &H100<br/>Private Const VK_CONTROL = &H11<br/>Private Const VK_SHIFT = &H10<br/>Private Const VK_MULTIPLY = &H6A<br/>Private Const VK_ADD = &H6B<br/>Private Const VK_SEPARATOR = &H6C<br/>Private Const VK_SUBTRACT = &H6D<br/>Private Const VK_DECIMAL = &H6E<br/>Private Const VK_DIVIDE = &H6F<br/>Private Const VK_PRIOR = &H21<br/>Private Const VK_NEXT = &H22<br/>Private Const VK_END = &H23<br/>Private Const VK_HOME = &H24<br/>Private Const VK_LEFT = &H25<br/>Private Const VK_UP = &H26<br/>Private Const VK_DOWN = &H28<br/>Private Const VK_RIGHT = &H27<br/>Private Const VK_INSERT = &H2D<br/>Private Const VK_DELETE = &H2E<br/>Private Const VK_F1 = &H70<br/>Private Const VK_F12 = &H7B<br/>Private Const VK_NUMLOCK = &H90<br/>Private Const VK_NUMPAD0 = &H60<br/>Private Const VK_NUMPAD9 = &H69<br/>Private Const VK_RETURN = &HD<br/>Private Const VK_SPACE = &H20<br/>Private Const VK_TAB = &H9<br/>Private Const VK_ESCAPE = &H1B<br/>Private Const VK_BACK = &H8<br/><br/>Private PrevHook As Long<br/><br/>Public Function LowLevelKeyboardProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long<br/> Dim p As PKBDLLHOOKSTRUCT<br/> Dim strKey As String<br/> <br/> If ncode = HC_ACTION Then<br/> Select Case wParam<br/> Case WM_KEYDOWN<br/> CopyMemory p, ByVal lParam, Len(p)<br/> <br/> If p.VKCode > 0 And p.VKCode < &H92 Then<br/> If (GetKeyState(VK_CONTROL) And &H8000) <> 0 Then<br/> strKey = "{Ctrl}+"<br/> End If<br/> <br/> If (GetKeyState(VK_SHIFT) And &H8000) <> 0 Then<br/> strKey = strKey & "{Shift}+"<br/> End If<br/> <br/> Select Case p.VKCode<br/> Case VK_MULTIPLY<br/> strKey = strKey & "{Multiply}"<br/> Case VK_ADD<br/> strKey = strKey & "{Add}"<br/> Case VK_SEPARATOR<br/> strKey = strKey & "{Separator}"<br/> Case VK_SUBTRACT<br/> strKey = strKey & "{Subtract}"<br/> Case VK_DECIMAL<br/> strKey = strKey & "{Decimal}"<br/> Case VK_DIVIDE<br/> strKey = strKey & "{Divide}"<br/> Case VK_PRIOR<br/> strKey = strKey & "{Prior}"<br/> Case VK_NEXT<br/> strKey = strKey & "{Nexe}"<br/> Case VK_END<br/> strKey = strKey & "{End}"<br/> Case VK_HOME<br/> strKey = strKey & "{Home}"<br/> Case VK_LEFT<br/> strKey = strKey & "{Left}"<br/> Case VK_UP<br/> strKey = strKey & "{Up}"<br/> Case VK_DOWN<br/> strKey = strKey & "{Down}"<br/> Case VK_RIGHT<br/> strKey = strKey & "{Right}"<br/> Case VK_INSERT<br/> strKey = strKey & "{Insert}"<br/> Case VK_DELETE<br/> strKey = strKey & "{Delete}"<br/> Case VK_BACK<br/> strKey = strKey & "{Back}"<br/> Case VK_F1 To VK_F12<br/> strKey = strKey & "F" & CStr(p.VKCode - &H70)<br/> Case VK_NUMLOCK<br/> strKey = strKey & "{NumLock}"<br/> Case VK_NUMPAD0 To VK_NUMPAD9<br/> strKey = strKey & CStr(p.VKCode - &H60)<br/> Case VK_RETURN<br/> strKey = strKey & "{Return}"<br/> Case VK_SPACE<br/> strKey = strKey & "{Space}"<br/> Case VK_TAB<br/> strKey = strKey & "{Tab}"<br/> Case VK_ESCAPE<br/> strKey = strKey & "{Escape}"<br/> Case &H30 To &H39, &H41 To &H5A<br/> strKey = strKey & Chr(p.VKCode)<br/> Case Else<br/> 'do nothing<br/> End Select<br/> End If<br/> <br/> Case Else<br/> 'do nothing<br/> <br/> End Select<br/> End If<br/> <br/> CallNextHookEx WH_KEYBOARD_LL, ncode, wParam, lParam<br/>End Function<br/>把工程自动建立的Class1类模块改名为cSystemHook,添加代码如下:<br/>Public Sub Hook()<br/> PrevHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)<br/>' Debug.Print PrevHook<br/>End Sub<br/><br/>Public Sub ReleaseHook()<br/> Open "f:\stud.txt" For Output As #1 <br/>Write #1,strKey<br/>Close #1 <br/><br/> Call UnhookWindowsHookEx(PrevHook)<br/>End Sub<br/><br/><br/><br/>'***************************<br/>编译生成DLL,做一个普通的工程,添加引用SysHook'<br/>Option Explicit <br/>Dim SS As cSystemHook <br/>Private Sub Form_Load()<br/> Set SS= New cSystemHook <br/> SS.HOOK<br/>End Sub<br/><br/>Private Sub Form_Unload(Cancel As Integer)<br/> SS.ReleaseHook<br/>End Sub
-
马云剑
回复于
2007-10-30
-
不需要用DLL的<br/>在2000及以上系统里直接支持鼠标键盘的全局HOOK