Tipp-Upload: VB.NET 0266: Globaler KeyHook
von Kriechi
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.
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 |
Verwendete API-Aufrufe: |
Download: |
' 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
Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.