要在.net的环境里使用全局钩子,http://www.codeproject.com/csharp/globalhook.asp?df=100&forumid=57596&select=1047065#xx1047065xx 是一篇好文章,提供的代码也相当可用了

我把他转成了VB.net并fix了一些小bug,贴在这里。
调用方法:

Private actHook As UserActivityHook


actHook = New UserActivityHook()

AddHandler actHook.OnMouseActivity, AddressOf myMouseEventHandler

AddHandler actHook.KeyDown, AddressOf myKeyEventHandler



在.net里使用全局钩子的代码Imports System
在.net里使用全局钩子的代码
Imports System.Runtime.InteropServices
在.net里使用全局钩子的代码
Imports System.Reflection
在.net里使用全局钩子的代码
Imports System.Threading
在.net里使用全局钩子的代码
Imports System.Windows.Forms
在.net里使用全局钩子的代码
 UserActivityHook
在.net里使用全局钩子的代码    
Inherits Object
在.net里使用全局钩子的代码
()
在.net里使用全局钩子的代码        Start()
在.net里使用全局钩子的代码    
End Sub
在.net里使用全局钩子的代码
 Finalize()
在.net里使用全局钩子的代码        StopMe()
在.net里使用全局钩子的代码    
End Sub
在.net里使用全局钩子的代码
在.net里使用全局钩子的代码    
Public Event OnMouseActivity As MouseEventHandler
在.net里使用全局钩子的代码    
Public Event KeyDown As KeyEventHandler
在.net里使用全局钩子的代码    
Public Event KeyPress As KeyPressEventHandler
在.net里使用全局钩子的代码    
Public Event KeyUp As KeyEventHandler
在.net里使用全局钩子的代码

在.net里使用全局钩子的代码    
Shared hMouseHook As Integer = 0
在.net里使用全局钩子的代码    
Shared hKeyboardHook As Integer = 0
在.net里使用全局钩子的代码    
Public Const WH_MOUSE_LL As Integer = 14
在.net里使用全局钩子的代码    
Public Const WH_KEYBOARD_LL As Integer = 13
在.net里使用全局钩子的代码    
Private MouseHookProcedure As HookProc
在.net里使用全局钩子的代码    
Private KeyboardHookProcedure As HookProc
在.net里使用全局钩子的代码
在.net里使用全局钩子的代码    
<StructLayout(LayoutKind.Sequential)> _
 POINT
在.net里使用全局钩子的代码        
Public x As Integer
在.net里使用全局钩子的代码        
Public y As Integer
在.net里使用全局钩子的代码    
End Class
在.net里使用全局钩子的代码
在.net里使用全局钩子的代码    
<StructLayout(LayoutKind.Sequential)> _
 MouseHookStruct
在.net里使用全局钩子的代码        
Public pt As POINT
在.net里使用全局钩子的代码        
Public hwnd As Integer
在.net里使用全局钩子的代码        
Public wHitTestCode As Integer
在.net里使用全局钩子的代码        
Public dwExtraInfo As Integer
在.net里使用全局钩子的代码    
End Class
在.net里使用全局钩子的代码
在.net里使用全局钩子的代码    
<StructLayout(LayoutKind.Sequential)> _
 KeyboardHookStruct
在.net里使用全局钩子的代码        
Public vkCode As Integer
在.net里使用全局钩子的代码        
Public scanCode As Integer
在.net里使用全局钩子的代码        
Public flags As Integer
在.net里使用全局钩子的代码        
Public time As Integer
在.net里使用全局钩子的代码        
Public dwExtraInfo As Integer
在.net里使用全局钩子的代码    
End Class
在.net里使用全局钩子的代码

在.net里使用全局钩子的代码

在.net里使用全局钩子的代码

在.net里使用全局钩子的代码
 Start()
在.net里使用全局钩子的代码        
If hMouseHook = 0 Then
在.net里使用全局钩子的代码            MouseHookProcedure 
= AddressOf MouseHookProc
在.net里使用全局钩子的代码            hMouseHook 
= SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)), 0)
在.net里使用全局钩子的代码            
If hMouseHook = 0 Then
在.net里使用全局钩子的代码                StopMe()
在.net里使用全局钩子的代码                
Throw New Exception("SetWindowsHookEx failed.")
在.net里使用全局钩子的代码            
End If
在.net里使用全局钩子的代码        
End If
在.net里使用全局钩子的代码        
If hKeyboardHook = 0 Then
在.net里使用全局钩子的代码            KeyboardHookProcedure 
= AddressOf KeyboardHookProc
在.net里使用全局钩子的代码            hKeyboardHook 
= SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)), 0)
在.net里使用全局钩子的代码            
If hKeyboardHook = 0 Then
在.net里使用全局钩子的代码                StopMe()
在.net里使用全局钩子的代码                
Throw New Exception("SetWindowsHookEx ist failed.")
在.net里使用全局钩子的代码            
End If
在.net里使用全局钩子的代码        
End If
在.net里使用全局钩子的代码    
End Sub
在.net里使用全局钩子的代码
 StopMe()
在.net里使用全局钩子的代码        
Dim retMouse As Boolean = True
在.net里使用全局钩子的代码        
Dim retKeyboard As Boolean = True
在.net里使用全局钩子的代码        
If Not (hMouseHook = 0Then
在.net里使用全局钩子的代码            retMouse 
= UnhookWindowsHookEx(hMouseHook)
在.net里使用全局钩子的代码            hMouseHook 
= 0
在.net里使用全局钩子的代码        
End If
在.net里使用全局钩子的代码        
If Not (hKeyboardHook = 0Then
在.net里使用全局钩子的代码            retKeyboard 
= UnhookWindowsHookEx(hKeyboardHook)
在.net里使用全局钩子的代码            hKeyboardHook 
= 0
在.net里使用全局钩子的代码        
End If
在.net里使用全局钩子的代码        
If Not (retMouse AndAlso retKeyboard) Then
在.net里使用全局钩子的代码            
Throw New Exception("UnhookWindowsHookEx failed.")
在.net里使用全局钩子的代码        
End If
在.net里使用全局钩子的代码    
End Sub
在.net里使用全局钩子的代码
在.net里使用全局钩子的代码    
Private Const WM_MOUSEMOVE As Integer = 512
在.net里使用全局钩子的代码    
Private Const WM_LBUTTONDOWN As Integer = 513
在.net里使用全局钩子的代码    
Private Const WM_RBUTTONDOWN As Integer = 516
在.net里使用全局钩子的代码    
Private Const WM_MBUTTONDOWN As Integer = 519
在.net里使用全局钩子的代码    
Private Const WM_LBUTTONUP As Integer = 514
在.net里使用全局钩子的代码    
Private Const WM_RBUTTONUP As Integer = 517
在.net里使用全局钩子的代码    
Private Const WM_MBUTTONUP As Integer = 520
在.net里使用全局钩子的代码    
Private Const WM_LBUTTONDBLCLK As Integer = 515
在.net里使用全局钩子的代码    
Private Const WM_RBUTTONDBLCLK As Integer = 518
在.net里使用全局钩子的代码    
Private Const WM_MBUTTONDBLCLK As Integer = 521
在.net里使用全局钩子的代码

在.net里使用全局钩子的代码        
If (nCode >= 0Then
在.net里使用全局钩子的代码            
Dim button As MouseButtons = MouseButtons.None
在.net里使用全局钩子的代码            
Select Case wParam
在.net里使用全局钩子的代码                
Case WM_LBUTTONDOWN
在.net里使用全局钩子的代码                    button 
= MouseButtons.Left
在.net里使用全局钩子的代码                    
' break
在.net里使用全局钩子的代码
                Case WM_RBUTTONDOWN
在.net里使用全局钩子的代码                    button 
= MouseButtons.Right
在.net里使用全局钩子的代码                    
' break
在.net里使用全局钩子的代码
            End Select
在.net里使用全局钩子的代码            
Dim clickCount As Integer = 0
在.net里使用全局钩子的代码            
If Not (button = MouseButtons.None) Then
在.net里使用全局钩子的代码                
If wParam = WM_LBUTTONDBLCLK OrElse wParam = WM_RBUTTONDBLCLK Then
在.net里使用全局钩子的代码                    clickCount 
= 2
在.net里使用全局钩子的代码                
Else
在.net里使用全局钩子的代码                    clickCount 
= 1
在.net里使用全局钩子的代码                
End If
在.net里使用全局钩子的代码            
End If
在.net里使用全局钩子的代码            
Dim MyMouseHookStruct As MouseHookStruct = CType(Marshal.PtrToStructure(lParam, GetType(MouseHookStruct)), MouseHookStruct)
在.net里使用全局钩子的代码            
Dim e As MouseEventArgs = New MouseEventArgs(button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0)
在.net里使用全局钩子的代码            
RaiseEvent OnMouseActivity(Me, e)
在.net里使用全局钩子的代码        
End If
在.net里使用全局钩子的代码        
Return CallNextHookEx(hMouseHook, nCode, wParam, lParam)
在.net里使用全局钩子的代码    
End Function
在.net里使用全局钩子的代码

在.net里使用全局钩子的代码

在.net里使用全局钩子的代码
在.net里使用全局钩子的代码    
Private Const WM_KEYDOWN As Integer = 256
在.net里使用全局钩子的代码    
Private Const WM_KEYUP As Integer = 257
在.net里使用全局钩子的代码    
Private Const WM_SYSKEYDOWN As Integer = 260
在.net里使用全局钩子的代码    
Private Const WM_SYSKEYUP As Integer = 261
在.net里使用全局钩子的代码
在.net里使用全局钩子的代码    
Private Key_Control_Down As Boolean = False
在.net里使用全局钩子的代码    
Private Key_Shift_Down As Boolean = False
在.net里使用全局钩子的代码    
Private Key_Alt_Down As Boolean = False
在.net里使用全局钩子的代码

在.net里使用全局钩子的代码        
If (nCode >= 0Then
在.net里使用全局钩子的代码            
Dim MyKeyboardHookStruct As KeyboardHookStruct = CType(Marshal.PtrToStructure(lParam, GetType(KeyboardHookStruct)), KeyboardHookStruct)
在.net里使用全局钩子的代码            
If (wParam = WM_KEYDOWN OrElse wParam = WM_SYSKEYDOWN) Then
在.net里使用全局钩子的代码                
Dim keyData As Keys = CType(MyKeyboardHookStruct.vkCode, Keys)
在.net里使用全局钩子的代码                
Select Case keydata
在.net里使用全局钩子的代码                    
Case Keys.LControlKey, Keys.RControlKey
在.net里使用全局钩子的代码                        Key_Control_Down 
= True
在.net里使用全局钩子的代码                    
Case Keys.LShiftKey, Keys.RShiftKey
在.net里使用全局钩子的代码                        Key_Shift_Down 
= True
在.net里使用全局钩子的代码                    
Case Keys.LMenu, Keys.RMenu
在.net里使用全局钩子的代码                        Key_Alt_Down 
= True
在.net里使用全局钩子的代码                
End Select
在.net里使用全局钩子的代码
在.net里使用全局钩子的代码                
If Key_Control_Down Then
在.net里使用全局钩子的代码                    keydata 
= keydata Or Keys.Control
在.net里使用全局钩子的代码                
End If
在.net里使用全局钩子的代码                
If Key_Shift_Down Then
在.net里使用全局钩子的代码                    keydata 
= keydata Or Keys.Shift
在.net里使用全局钩子的代码                
End If
在.net里使用全局钩子的代码                
If Key_Alt_Down Then
在.net里使用全局钩子的代码                    keydata 
= keydata Or Keys.Alt
在.net里使用全局钩子的代码                
End If
在.net里使用全局钩子的代码
在.net里使用全局钩子的代码                
Dim e As KeyEventArgs = New KeyEventArgs(keyData)
在.net里使用全局钩子的代码                
RaiseEvent KeyDown(Me, e)
在.net里使用全局钩子的代码            
End If
在.net里使用全局钩子的代码            
'If wParam = WM_KEYDOWN Then
在.net里使用全局钩子的代码
            '    Dim keyState(-1) As Byte
在.net里使用全局钩子的代码
            '    GetKeyboardState(keyState)
在.net里使用全局钩子的代码
            '    Dim inBuffer(-1) As Byte
在.net里使用全局钩子的代码
            '    If ToAscii(MyKeyboardHookStruct.vkCode, MyKeyboardHookStruct.scanCode, keyState, inBuffer, MyKeyboardHookStruct.flags) = 1 Then
在.net里使用全局钩子的代码
            '        Dim e As KeyPressEventArgs = New KeyPressEventArgs(ChrW(inBuffer(0)))
在.net里使用全局钩子的代码
            '        RaiseEvent KeyPress(Me, e)
在.net里使用全局钩子的代码
            '    End If
在.net里使用全局钩子的代码
            'End If
在.net里使用全局钩子的代码
            If (wParam = WM_KEYUP OrElse wParam = WM_SYSKEYUP) Then
在.net里使用全局钩子的代码                
Dim keyData As Keys = CType(MyKeyboardHookStruct.vkCode, Keys)
在.net里使用全局钩子的代码                
Select Case keydata
在.net里使用全局钩子的代码                    
Case Keys.LControlKey, Keys.RControlKey
在.net里使用全局钩子的代码                        Key_Control_Down 
= False
在.net里使用全局钩子的代码                    
Case Keys.LShiftKey, Keys.RShiftKey
在.net里使用全局钩子的代码                        Key_Shift_Down 
= False
在.net里使用全局钩子的代码                    
Case Keys.LMenu, Keys.RMenu
在.net里使用全局钩子的代码                        Key_Alt_Down 
= False
在.net里使用全局钩子的代码                
End Select
在.net里使用全局钩子的代码
在.net里使用全局钩子的代码                
If Key_Control_Down Then
在.net里使用全局钩子的代码                    keydata 
= keydata Or Keys.Control
在.net里使用全局钩子的代码                
End If
在.net里使用全局钩子的代码                
If Key_Shift_Down Then
在.net里使用全局钩子的代码                    keydata 
= keydata Or Keys.Shift
在.net里使用全局钩子的代码                
End If
在.net里使用全局钩子的代码                
If Key_Alt_Down Then
在.net里使用全局钩子的代码                    keydata 
= keydata Or Keys.Alt
在.net里使用全局钩子的代码                
End If
在.net里使用全局钩子的代码
在.net里使用全局钩子的代码                
Dim e As KeyEventArgs = New KeyEventArgs(keyData)
在.net里使用全局钩子的代码                
RaiseEvent KeyUp(Me, e)
在.net里使用全局钩子的代码            
End If
在.net里使用全局钩子的代码        
End If
在.net里使用全局钩子的代码        
Return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)
在.net里使用全局钩子的代码    
End Function
在.net里使用全局钩子的代码
End Class

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-07-21
  • 2022-12-23
  • 2021-06-20
  • 2021-08-07
  • 2022-12-23
猜你喜欢
  • 2021-12-03
  • 2022-12-23
  • 2022-12-23
  • 2021-05-31
  • 2022-12-23
  • 2021-10-29
相关资源
相似解决方案