Guest User

Mouse Logger

a guest
Jul 17th, 2013
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 19.38 KB | None | 0 0
  1. 'frmMain:
  2.  
  3. Imports System.IO
  4.  
  5. Public Class frmMain
  6.  
  7.     Dim strStreamWriter As StreamWriter
  8.  
  9.     Public WithEvents KeysHook As New KeyboardHook
  10.  
  11.     Dim Auto_Backspace_Key As Boolean = True
  12.     Dim Auto_Enter_Key As Boolean = True
  13.     Dim Auto_Tab_Key As Boolean = True
  14.     Dim No_F_Keys As Boolean = False
  15.  
  16.     Private Sub KeysHook_KeyDown(ByVal Key As Keys) Handles KeysHook.KeyDown
  17.  
  18.         Select Case Control.ModifierKeys
  19.  
  20.             Case 393216 ' Alt-GR + Key
  21.  
  22.                 Select Case Key
  23.                     Case Keys.D1 : Key_Listener("|")
  24.                     Case Keys.D2 : Key_Listener("@")
  25.                     Case Keys.D3 : Key_Listener("#")
  26.                     Case Keys.D4 : Key_Listener("~")
  27.                     Case Keys.D5 : Key_Listener("€")
  28.                     Case Keys.D6 : Key_Listener("¬")
  29.                     Case Keys.E : Key_Listener("€")
  30.                     Case Keys.Oem1 : Key_Listener("[")
  31.                     Case Keys.Oem5 : Key_Listener("\")
  32.                     Case Keys.Oem7 : Key_Listener("{")
  33.                     Case Keys.Oemplus : Key_Listener("]")
  34.                     Case Keys.OemQuestion : Key_Listener("}")
  35.                     Case Else : Key_Listener("")
  36.                 End Select
  37.  
  38.             Case 65536 ' LShift/RShift + Key
  39.  
  40.                 Select Case Key
  41.                     Case Keys.D0 : Key_Listener("=")
  42.                     Case Keys.D1 : Key_Listener("!")
  43.                     Case Keys.D2 : Key_Listener("""")
  44.                     Case Keys.D3 : Key_Listener("·")
  45.                     Case Keys.D4 : Key_Listener("$")
  46.                     Case Keys.D5 : Key_Listener("%")
  47.                     Case Keys.D6 : Key_Listener("&")
  48.                     Case Keys.D7 : Key_Listener("/")
  49.                     Case Keys.D8 : Key_Listener("(")
  50.                     Case Keys.D9 : Key_Listener(")")
  51.                     Case Keys.Oem1 : Key_Listener("^")
  52.                     Case Keys.Oem5 : Key_Listener("ª")
  53.                     Case Keys.Oem6 : Key_Listener("¿")
  54.                     Case Keys.Oem7 : Key_Listener("¨")
  55.                     Case Keys.OemBackslash : Key_Listener(">")
  56.                     Case Keys.Oemcomma : Key_Listener(";")
  57.                     Case Keys.OemMinus : Key_Listener("_")
  58.                     Case Keys.OemOpenBrackets : Key_Listener("?")
  59.                     Case Keys.OemPeriod : Key_Listener(":")
  60.                     Case Keys.Oemplus : Key_Listener("*")
  61.                     Case Keys.OemQuestion : Key_Listener("Ç")
  62.                     Case Keys.Oemtilde : Key_Listener("Ñ")
  63.                     Case Else : Key_Listener("")
  64.                 End Select
  65.  
  66.             Case Else
  67.  
  68.                 If Key.ToString.Length = 1 Then ' Single alpha key
  69.  
  70.                     If Control.IsKeyLocked(Keys.CapsLock) Or Control.ModifierKeys = Keys.Shift Then
  71.                         Key_Listener(Key.ToString.ToUpper)
  72.                     Else
  73.                         Key_Listener(Key.ToString.ToLower)
  74.                     End If
  75.  
  76.                 Else
  77.  
  78.                     Select Case Key ' Single special key
  79.                         Case Keys.Add : Key_Listener("+")
  80.                         Case Keys.Back : Key_Listener("{BackSpace}")
  81.                         Case Keys.D0 : Key_Listener("0")
  82.                         Case Keys.D1 : Key_Listener("1")
  83.                         Case Keys.D2 : Key_Listener("2")
  84.                         Case Keys.D3 : Key_Listener("3")
  85.                         Case Keys.D4 : Key_Listener("4")
  86.                         Case Keys.D5 : Key_Listener("5")
  87.                         Case Keys.D6 : Key_Listener("6")
  88.                         Case Keys.D7 : Key_Listener("7")
  89.                         Case Keys.D8 : Key_Listener("8")
  90.                         Case Keys.D9 : Key_Listener("9")
  91.                         Case Keys.Decimal : Key_Listener(".")
  92.                         Case Keys.Delete : Key_Listener("{Supr}")
  93.                         Case Keys.Divide : Key_Listener("/")
  94.                         Case Keys.End : Key_Listener("{End}")
  95.                         Case Keys.Enter : Key_Listener("{Enter}")
  96.                         Case Keys.F1 : Key_Listener("{F1}")
  97.                         Case Keys.F10 : Key_Listener("{F10}")
  98.                         Case Keys.F11 : Key_Listener("{F11}")
  99.                         Case Keys.F12 : Key_Listener("{F12}")
  100.                         Case Keys.F2 : Key_Listener("{F2}")
  101.                         Case Keys.F3 : Key_Listener("{F3}")
  102.                         Case Keys.F4 : Key_Listener("{F4}")
  103.                         Case Keys.F5 : Key_Listener("{F5}")
  104.                         Case Keys.F6 : Key_Listener("{F6}")
  105.                         Case Keys.F7 : Key_Listener("{F7}")
  106.                         Case Keys.F8 : Key_Listener("{F8}")
  107.                         Case Keys.F9 : Key_Listener("{F9}")
  108.                         Case Keys.Home : Key_Listener("{Home}")
  109.                         Case Keys.Insert : Key_Listener("{Insert}")
  110.                         Case Keys.Multiply : Key_Listener("*")
  111.                         Case Keys.NumPad0 : Key_Listener("0")
  112.                         Case Keys.NumPad1 : Key_Listener("1")
  113.                         Case Keys.NumPad2 : Key_Listener("2")
  114.                         Case Keys.NumPad3 : Key_Listener("3")
  115.                         Case Keys.NumPad4 : Key_Listener("4")
  116.                         Case Keys.NumPad5 : Key_Listener("5")
  117.                         Case Keys.NumPad6 : Key_Listener("6")
  118.                         Case Keys.NumPad7 : Key_Listener("7")
  119.                         Case Keys.NumPad8 : Key_Listener("8")
  120.                         Case Keys.NumPad9 : Key_Listener("9")
  121.                         Case Keys.Oem1 : Key_Listener("`")
  122.                         Case Keys.Oem5 : Key_Listener("º")
  123.                         Case Keys.Oem6 : Key_Listener("¡")
  124.                         Case Keys.Oem7 : Key_Listener("´")
  125.                         Case Keys.OemBackslash : Key_Listener("<")
  126.                         Case Keys.Oemcomma : Key_Listener(",")
  127.                         Case Keys.OemMinus : Key_Listener(".")
  128.                         Case Keys.OemOpenBrackets : Key_Listener("'")
  129.                         Case Keys.OemPeriod : Key_Listener("-")
  130.                         Case Keys.Oemplus : Key_Listener("+")
  131.                         Case Keys.OemQuestion : Key_Listener("ç")
  132.                         Case Keys.Oemtilde : Key_Listener("ñ")
  133.                         Case Keys.PageDown : Key_Listener("{AvPag}")
  134.                         Case Keys.PageUp : Key_Listener("{RePag}")
  135.                         Case Keys.Space : Key_Listener(" ")
  136.                         Case Keys.Subtract : Key_Listener("-")
  137.                         Case Keys.Tab : Key_Listener("{Tabulation}")
  138.                         Case Else : Key_Listener("")
  139.                     End Select
  140.  
  141.                 End If
  142.  
  143.         End Select
  144.  
  145.     End Sub
  146.  
  147.     Public Sub Key_Listener(ByVal key As String)
  148.  
  149.         If key = "{F8}" Then
  150.             AddHandler mHook.Mouse_Left_DoubleClick, AddressOf mHook_Mouse_Left_DoubleClick
  151.             AddHandler mHook.Mouse_Left_Down, AddressOf mHook_Mouse_Left_Down
  152.             AddHandler mHook.Mouse_Left_Up, AddressOf mHook_Mouse_Left_Up
  153.             AddHandler mHook.Mouse_Middle_DoubleClick, AddressOf mHook_Mouse_Middle_DoubleClick
  154.             AddHandler mHook.Mouse_Middle_Down, AddressOf mHook_Mouse_Middle_Down
  155.             AddHandler mHook.Mouse_Middle_Up, AddressOf mHook_Mouse_Middle_Up
  156.             'AddHandler mHook.Mouse_Move, AddressOf mHook_Mouse_Move
  157.             AddHandler mHook.Mouse_Right_DoubleClick, AddressOf mHook_Mouse_Right_DoubleClick
  158.             AddHandler mHook.Mouse_Right_Down, AddressOf mHook_Mouse_Right_Down
  159.             AddHandler mHook.Mouse_Right_Up, AddressOf mHook_Mouse_Right_Up
  160.             AddHandler mHook.Mouse_Wheel, AddressOf mHook_Mouse_Wheel
  161.         End If
  162.  
  163.     End Sub
  164.  
  165.     Private WithEvents mHook As New MouseHook
  166.  
  167.     Private Sub mHook_Mouse_Left_DoubleClick(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Left_DoubleClick
  168.         Escribir("Mouse Left Double Click At: (" & ptLocat.X & "," & ptLocat.Y & ")")
  169.     End Sub
  170.  
  171.     Private Sub mHook_Mouse_Left_Down(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Left_Down
  172.         Escribir("Mouse Left Down At: (" & ptLocat.X & "," & ptLocat.Y & ")")
  173.     End Sub
  174.  
  175.     Private Sub mHook_Mouse_Left_Up(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Left_Up
  176.         Escribir("Mouse Left Up At: (" & ptLocat.X & "," & ptLocat.Y & ")")
  177.     End Sub
  178.  
  179.     Private Sub mHook_Mouse_Middle_DoubleClick(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Middle_DoubleClick
  180.         Escribir("Mouse Middle Double Click At: (" & ptLocat.X & "," & ptLocat.Y & ")")
  181.     End Sub
  182.  
  183.     Private Sub mHook_Mouse_Middle_Down(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Middle_Down
  184.         Escribir("Mouse Middle Down At: (" & ptLocat.X & "," & ptLocat.Y & ")")
  185.     End Sub
  186.  
  187.     Private Sub mHook_Mouse_Middle_Up(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Middle_Up
  188.         Escribir("Mouse Middle Up At: (" & ptLocat.X & "," & ptLocat.Y & ")")
  189.     End Sub
  190.  
  191.     Private Sub mHook_Mouse_Move(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Move
  192.         ''Will be called every time the mouse moves
  193.     End Sub
  194.  
  195.     Private Sub mHook_Mouse_Right_DoubleClick(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Right_DoubleClick
  196.         Escribir("Mouse Right Double Click At: (" & ptLocat.X & "," & ptLocat.Y & ")")
  197.     End Sub
  198.  
  199.     Private Sub mHook_Mouse_Right_Down(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Right_Down
  200.         Escribir("Mouse Right Down At: (" & ptLocat.X & "," & ptLocat.Y & ")")
  201.     End Sub
  202.  
  203.     Private Sub mHook_Mouse_Right_Up(ByVal ptLocat As System.Drawing.Point) Handles mHook.Mouse_Right_Up
  204.         Escribir("Mouse Right Up At: (" & ptLocat.X & "," & ptLocat.Y & ")")
  205.     End Sub
  206.  
  207.     Private Sub mHook_Mouse_Wheel(ByVal ptLocat As System.Drawing.Point, ByVal Direction As MouseHook.Wheel_Direction) Handles mHook.Mouse_Wheel
  208.         Escribir("Mouse Scroll: " & Direction.ToString & " At: (" & ptLocat.X & "," & ptLocat.Y & ")")
  209.     End Sub
  210.  
  211.     Private Sub Escribir(ByVal texto As String)
  212.         Dim sRenglon As String = Nothing
  213.         Dim strStreamW As Stream = Nothing
  214.         strStreamWriter = Nothing
  215.         Dim ContenidoArchivo As String = Nothing
  216.         ' Donde guardamos los paths de los archivos que vamos a estar utilizando ..
  217.         Dim PathArchivo As String
  218.  
  219.  
  220.         'Dim i As Integer
  221.  
  222.         Try
  223.  
  224.             'If Directory.Exists("C:\Capeta") = False Then ' si no existe la carpeta se crea
  225.             '    Directory.CreateDirectory("C:\carpeta")
  226.             'End If
  227.  
  228.             'Windows.Forms.Cursor.Current = Cursors.WaitCursor
  229.             PathArchivo = "Mouse Logger.txt" ' Se determina el nombre del archivo con la fecha actual
  230.  
  231.             'verificamos si existe el archivo
  232.  
  233.             If File.Exists(PathArchivo) Then
  234.                 strStreamW = File.Open(PathArchivo, FileMode.Open) 'Abrimos el archivo
  235.             Else
  236.                 strStreamW = File.Create(PathArchivo) ' lo creamos
  237.             End If
  238.  
  239.             strStreamWriter = New StreamWriter(strStreamW, System.Text.Encoding.Default) ' tipo de codificacion para escritura
  240.  
  241.  
  242.             'escribimos en el archivo
  243.  
  244.             strStreamWriter.Write(texto)
  245.  
  246.  
  247.             strStreamWriter.Close() ' cerramos
  248.  
  249.         Catch ex As Exception
  250.             MsgBox("Error al Guardar la ingormacion en el archivo. " & ex.ToString, MsgBoxStyle.Critical, Application.ProductName)
  251.             strStreamWriter.Close() ' cerramos
  252.         End Try
  253.     End Sub
  254.  
  255.     Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  256.  
  257.     End Sub
  258.  
  259. End Class
  260.  
  261. 'Classes:
  262.  
  263. Imports System.Runtime.InteropServices
  264.  
  265. Public Class MouseHook
  266.     Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As MouseProcDelegate, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer
  267.     Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As MSLLHOOKSTRUCT) As Integer
  268.     Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer
  269.     Private Delegate Function MouseProcDelegate(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As MSLLHOOKSTRUCT) As Integer
  270.  
  271.     Private Structure MSLLHOOKSTRUCT
  272.         Public pt As Point
  273.         Public mouseData As Integer
  274.         Public flags As Integer
  275.         Public time As Integer
  276.         Public dwExtraInfo As Integer
  277.     End Structure
  278.  
  279.     Public Enum Wheel_Direction
  280.         WheelUp
  281.         WheelDown
  282.     End Enum
  283.  
  284.     Private Const HC_ACTION As Integer = 0
  285.     Private Const WH_MOUSE_LL As Integer = 14
  286.     Private Const WM_MOUSEMOVE As Integer = &H200
  287.     Private Const WM_LBUTTONDOWN As Integer = &H201
  288.     Private Const WM_LBUTTONUP As Integer = &H202
  289.     Private Const WM_LBUTTONDBLCLK As Integer = &H203
  290.     Private Const WM_RBUTTONDOWN As Integer = &H204
  291.     Private Const WM_RBUTTONUP As Integer = &H205
  292.     Private Const WM_RBUTTONDBLCLK As Integer = &H206
  293.     Private Const WM_MBUTTONDOWN As Integer = &H207
  294.     Private Const WM_MBUTTONUP As Integer = &H208
  295.     Private Const WM_MBUTTONDBLCLK As Integer = &H209
  296.     Private Const WM_MOUSEWHEEL As Integer = &H20A
  297.  
  298.     Private MouseHook As Integer
  299.     Private MouseHookDelegate As MouseProcDelegate
  300.  
  301.     Public Event Mouse_Move(ByVal ptLocat As Point)
  302.     Public Event Mouse_Left_Down(ByVal ptLocat As Point)
  303.     Public Event Mouse_Left_Up(ByVal ptLocat As Point)
  304.     Public Event Mouse_Left_DoubleClick(ByVal ptLocat As Point)
  305.     Public Event Mouse_Right_Down(ByVal ptLocat As Point)
  306.     Public Event Mouse_Right_Up(ByVal ptLocat As Point)
  307.     Public Event Mouse_Right_DoubleClick(ByVal ptLocat As Point)
  308.     Public Event Mouse_Middle_Down(ByVal ptLocat As Point)
  309.     Public Event Mouse_Middle_Up(ByVal ptLocat As Point)
  310.     Public Event Mouse_Middle_DoubleClick(ByVal ptLocat As Point)
  311.     Public Event Mouse_Wheel(ByVal ptLocat As Point, ByVal Direction As Wheel_Direction)
  312.  
  313.     Public Sub New()
  314.         MouseHookDelegate = New MouseProcDelegate(AddressOf MouseProc)
  315.         MouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookDelegate, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
  316.     End Sub
  317.  
  318.     Private Function MouseProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As MSLLHOOKSTRUCT) As Integer
  319.         If (nCode = HC_ACTION) Then
  320.             Select Case wParam
  321.                 Case WM_MOUSEMOVE
  322.                     RaiseEvent Mouse_Move(lParam.pt)
  323.                 Case WM_LBUTTONDOWN
  324.                     RaiseEvent Mouse_Left_Down(lParam.pt)
  325.                 Case WM_LBUTTONUP
  326.                     RaiseEvent Mouse_Left_Up(lParam.pt)
  327.                 Case WM_LBUTTONDBLCLK
  328.                     RaiseEvent Mouse_Left_DoubleClick(lParam.pt)
  329.                 Case WM_RBUTTONDOWN
  330.                     RaiseEvent Mouse_Right_Down(lParam.pt)
  331.                 Case WM_RBUTTONUP
  332.                     RaiseEvent Mouse_Right_Up(lParam.pt)
  333.                 Case WM_RBUTTONDBLCLK
  334.                     RaiseEvent Mouse_Right_DoubleClick(lParam.pt)
  335.                 Case WM_MBUTTONDOWN
  336.                     RaiseEvent Mouse_Middle_Down(lParam.pt)
  337.                 Case WM_MBUTTONUP
  338.                     RaiseEvent Mouse_Middle_Up(lParam.pt)
  339.                 Case WM_MBUTTONDBLCLK
  340.                     RaiseEvent Mouse_Middle_DoubleClick(lParam.pt)
  341.                 Case WM_MOUSEWHEEL
  342.                     Dim wDirection As Wheel_Direction
  343.                     If lParam.mouseData < 0 Then
  344.                         wDirection = Wheel_Direction.WheelDown
  345.                     Else
  346.                         wDirection = Wheel_Direction.WheelUp
  347.                     End If
  348.                     RaiseEvent Mouse_Wheel(lParam.pt, wDirection)
  349.             End Select
  350.         End If
  351.         Return CallNextHookEx(MouseHook, nCode, wParam, lParam)
  352.     End Function
  353.  
  354.     Protected Overrides Sub Finalize()
  355.         UnhookWindowsHookEx(MouseHook)
  356.         MyBase.Finalize()
  357.     End Sub
  358. End Class
  359.  
  360. Public Class KeyboardHook
  361.  
  362.     <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
  363.     Private Overloads Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal HookProc As KBDLLHookProc, ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
  364.     End Function
  365.  
  366.     <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
  367.     Private Overloads Shared Function CallNextHookEx(ByVal idHook As Integer, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
  368.     End Function
  369.  
  370.     <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
  371.     Private Overloads Shared Function UnhookWindowsHookEx(ByVal idHook As Integer) As Boolean
  372.     End Function
  373.  
  374.     <StructLayout(LayoutKind.Sequential)> _
  375.     Private Structure KBDLLHOOKSTRUCT
  376.         Public vkCode As UInt32
  377.         Public scanCode As UInt32
  378.         Public flags As KBDLLHOOKSTRUCTFlags
  379.         Public time As UInt32
  380.         Public dwExtraInfo As UIntPtr
  381.     End Structure
  382.  
  383.     <Flags()> _
  384.     Private Enum KBDLLHOOKSTRUCTFlags As UInt32
  385.         LLKHF_EXTENDED = &H1
  386.         LLKHF_INJECTED = &H10
  387.         LLKHF_ALTDOWN = &H20
  388.         LLKHF_UP = &H80
  389.     End Enum
  390.  
  391.     Public Shared Event KeyDown(ByVal Key As Keys)
  392.     Public Shared Event KeyUp(ByVal Key As Keys)
  393.  
  394.     Private Const WH_KEYBOARD_LL As Integer = 13
  395.     Private Const HC_ACTION As Integer = 0
  396.     Private Const WM_KEYDOWN = &H100
  397.     Private Const WM_KEYUP = &H101
  398.     Private Const WM_SYSKEYDOWN = &H104
  399.     Private Const WM_SYSKEYUP = &H105
  400.  
  401.     Private Delegate Function KBDLLHookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
  402.  
  403.     Private KBDLLHookProcDelegate As KBDLLHookProc = New KBDLLHookProc(AddressOf KeyboardProc)
  404.     Private HHookID As IntPtr = IntPtr.Zero
  405.  
  406.     Private Function KeyboardProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
  407.         If (nCode = HC_ACTION) Then
  408.             Dim struct As KBDLLHOOKSTRUCT
  409.             Select Case wParam
  410.                 Case WM_KEYDOWN, WM_SYSKEYDOWN
  411.                     RaiseEvent KeyDown(CType(CType(Marshal.PtrToStructure(lParam, struct.GetType()), KBDLLHOOKSTRUCT).vkCode, Keys))
  412.                 Case WM_KEYUP, WM_SYSKEYUP
  413.                     RaiseEvent KeyUp(CType(CType(Marshal.PtrToStructure(lParam, struct.GetType()), KBDLLHOOKSTRUCT).vkCode, Keys))
  414.             End Select
  415.         End If
  416.         Return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam)
  417.     End Function
  418.  
  419.     Public Sub New()
  420.         HHookID = SetWindowsHookEx(WH_KEYBOARD_LL, KBDLLHookProcDelegate, System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
  421.         If HHookID = IntPtr.Zero Then
  422.             Throw New Exception("Could not set keyboard hook")
  423.         End If
  424.     End Sub
  425.  
  426.     Protected Overrides Sub Finalize()
  427.         If Not HHookID = IntPtr.Zero Then
  428.             UnhookWindowsHookEx(HHookID)
  429.         End If
  430.         MyBase.Finalize()
  431.     End Sub
  432.  
  433. End Class
Advertisement
Add Comment
Please, Sign In to add comment