Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0266: Globaler KeyHook

 von 

Hinweis zum Tippvorschlag  

Dieser Vorschlag wurde noch nicht auf Sinn und Inhalt überprüft und die Zip-Datei wurde noch nicht auf schädlichen Inhalt hin untersucht.
Bitte haben Sie ein wenig Geduld, bis die Freigabe erfolgt.

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Sonstiges
  • System

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
Key, Hook, KeyHook, Tastatur, Keyboard

Damit er übernommen werden kann, müssen noch Änderungen daran vorgenommen werden. Sofern Sie der Autor sind, können Sie sich anmelden, um die Liste einzusehen.

Der Vorschlag wurde erstellt am: 06.05.2008 18:48.
Die letzte Aktualisierung erfolgte am 10.05.2008 19:44.

Zurück zur Übersicht

Beschreibung  

Hiermit ist es möglich alle Tastenanschläge, systemweit abzufangen.
Um den Keyhook zu aktivieren, muss man nur
KeyHookEnable = true setzen.

In der Funktion KeyboardHookProc, kann man dann nach der Abfrage des nCode-Wertes (muss =0 sein, sonst ungültig) seine Operationen mit den Variablen machen.

Schwierigkeitsgrad

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [12,78 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' -------- Anfang Projektgruppe Globaler KeyHook.sln  --------
' ------- Anfang Projektdatei Globaler KeyHook.vbproj  -------
' ------------------ Anfang Datei Form1.vb  ------------------
Imports System.Runtime.InteropServices

Public Class Form1

    Private Declare Unicode Function GetModuleHandleW Lib "kernel32.dll" ( _
                                     ByVal lpModuleName As IntPtr) As IntPtr

    Private Delegate Function HOOKPROCDelegate(ByVal nCode As Integer, ByVal wParam As _
        IntPtr, ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr

    Private Declare Unicode Function SetWindowsHookExW Lib "user32.dll" ( _
                                     ByVal idHook As Integer, _
                                     ByVal lpfn As HOOKPROCDelegate, _
                                     ByVal hMod As IntPtr, _
                                     ByVal dwThreadId As UInteger) As IntPtr

    Private HookProc As New HOOKPROCDelegate(AddressOf KeyboardHookProc) ' dauerhafte
                                                                         ' Delegaten-Variable
                                                                         ' erzeugen

    Private Declare Unicode Function UnhookWindowsHookEx Lib "user32.dll" ( _
                                     ByVal hhk As IntPtr) As UInteger

    Private Declare Unicode Function CallNextHookEx Lib "user32.dll" ( _
                                     ByVal hhk As IntPtr, _
                                     ByVal nCode As Integer, _
                                     ByVal wParam As IntPtr, _
                                     ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr

    Private Const WM_KEYDOWN As Int32 = &H100
    Private Const WM_KEYUP As Int32 = &H101
    Private Const WH_KEYBOARD_LL As Integer = 13
    Private Const HC_ACTION As Integer = 0

    Private mHandle As IntPtr

    Public PrevWndProc As Integer

    <StructLayout(LayoutKind.Sequential)> Public Structure KBDLLHOOKSTRUCT

        Public vkCode As Keys
        Public scanCode, flags, time, dwExtraInfo As UInteger

        Public Sub New(ByVal key As Keys, ByVal scancod As UInteger, ByVal flagss As _
            UInteger, ByVal zeit As UInteger, ByVal extra As UInteger)

            vkCode = key
            scanCode = scancod
            flags = flagss
            time = zeit
            dwExtraInfo = extra

        End Sub

    End Structure

    Public Property KeyHookEnable() As Boolean
        Get
            Return mHandle <> IntPtr.Zero

        End Get

        Set(ByVal value As Boolean)

            If KeyHookEnable = value Then Return
            If value Then

                mHandle = SetWindowsHookExW(WH_KEYBOARD_LL, HookProc, GetModuleHandleW( _
                    IntPtr.Zero), 0)

            Else

                UnhookWindowsHookEx(mHandle)
                mHandle = IntPtr.Zero
            End If

        End Set

    End Property

    Private Function KeyboardHookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef _
        lParam As KBDLLHOOKSTRUCT) As IntPtr

        Dim fEatKeyStroke As Boolean

        ' Console.Write(lParam.vkCode.ToString & ", nCode: " & CStr(nCode) & ", wParam: " &
        ' CStr(wParam) & ", lParam.vkCode: " & CStr(lParam.vkCode) & ", lParam.dwExtraInfo:
        ' " & CStr(lParam.dwExtraInfo) & ", lParam.flags: " & CStr(lParam.flags) & ",
        ' lParam.scanCode: " & CStr(lParam.scanCode) & vbCrLf)

        If nCode = HC_ACTION Then

            ' wParam kann folgende Werte annehmen WM_KEYUP und WM_KEYDOWN (Taste
            ' gedrückt/losgelassen)
            ' wird fEatKeyStroke=true gesetzt, so wird dieser Tastendruck "verschluckt", er
            ' hat für das System  NIE statt gefunden.
            '
            ' nun als kleines Beispiel, wird es nicht mehr möglich sein ein A zu schreiben.
            If lParam.vkCode = Keys.A Then
                fEatKeyStroke = True
            End If

            ' noch ein Bsp, bei Druck von X wird eine Nachricht ausgegeben und der
            ' Tastendruck verschluckt
            If lParam.vkCode = Keys.X Then

                MessageBox.Show("Ein X wurde gerückt" & vbNewLine & wParam.ToString, _
                    "Globaler KeyHook", MessageBoxButtons.OK, MessageBoxIcon.Information)

                fEatKeyStroke = True
            End If
        End If

        If fEatKeyStroke Then
            Return New IntPtr(1)

            Exit Function

        End If

        Return CallNextHookEx(mHandle, nCode, wParam, lParam)

    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Button1.Click

        KeyHookEnable = True
        Label1.Text = "KeyHook aktiv!"

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Button2.Click

        KeyHookEnable = False
        Label1.Text = "KeyHook nicht aktiv"

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load

        Button2.PerformClick()

    End Sub

End Class

' ------------------- Ende Datei Form1.vb  -------------------
' -------- Ende Projektdatei Globaler KeyHook.vbproj  --------
' --------- Ende Projektgruppe Globaler KeyHook.sln  ---------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Folgende Diskussionen existieren bereits

Globaler KeyHook - Kriechi 06.05.2008 18:50

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.