vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 2.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2017
 
zurück
Rubrik: Maus & Tastatur · Tastatursteuerung   |   VB-Versionen: VB2005, VB200830.03.09
Tastatureingaben VOR Windows abfangen

Mithilfe eines globalen Hooks können die Tastendrücke vor Windows abgefangen werden.

Autor:   Florian KolbBewertung:     [ Jetzt bewerten ]Views:  20.026 
www.fk-freeware.de.vuSystem:  Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Summer-Special bei Tools & Components!
Gute Laune Sommer bei Tools & Components
Top Summer-Special - Sparen Sie teilweise bis zu 120,- EUR
Alle sev-Entwicklerkomponenten und Komplettpakete jetzt bis zu 25% reduziert!
zum Beispiel:
  • Developer CD nur 479,20 EUR statt 599,- EUR
  • sevDTA 3.0 nur 224,30 EUR statt 299,- EUR
  •  
  • vb@rchiv   Vol.6 nur 20,00 EUR statt 24,95 EUR
  • sevCoolbar 3.0 nur 55,20 EUR statt 69,- EUR
  • - Werbung -Und viele weitere Angebote           Aktionspreise nur für kurze Zeit gültig

    Gibt es eigentlich eine Möglichkeit, die Tastendrücke bereits VOR dem Betriebssystem abzufangen? Die gibt es. Mit einem globalen Hook ist das möglich. Dieser fängt in einer Funktion die Tastatureingaben ab und legt fest, ob und welche Eingaben z. B. auch verworfen werden können! Denn damit hat das Ereignis für Windows nie stattgefunden.

    Doch wie geht das jetzt? Dafür wird die Funktion "SetWindowsHookExW" aus der user32.dll benötigt. Für das Löschen des Hooks verwenden wir "UnhookWindowsHookEx". Damit die Tastatureingaben aber noch abgefangen werden können, muss die Funktion "KeyboardHookProc" her.

    Das ganze sieht dann wie folgt aus:

    Imports System.Runtime.InteropServices
    Public Class Form1
      Private Declare Sub keybd_event Lib "user32" ( _
        ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwFlags As Integer, _
        ByVal dwExtraInfo As Integer)
     
      Private Const KEYEVENTF_KEYUP = &H2
     
      Private Delegate Function HOOKPROCDelegate( _
        ByVal nCode As Integer, _
        ByVal wParam As IntPtr, _
        ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr
     
      ' dauerhafte Delegaten-Variable erzeugen
      Private HookProc As New HOOKPROCDelegate(AddressOf KeyboardHookProc)
     
      Private Declare Unicode Function GetModuleHandleW Lib "kernel32.dll" ( _
        ByVal lpModuleName As IntPtr) As IntPtr
     
      ' Die Funktion, um einen globalen Hook setzen zu können:
      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
     
      ' Für das Löschen des Hooks wird diese Funktion verwendet:
      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    ' Konstante für WM_KEYDOWN
      Private Const WM_KEYUP As Int32 = &H101      ' Konstante für WM_KEYUP
      Private Const HC_ACTION As Integer = 0       ' Konstante für HC_ACTION
      Private Const WH_KEYBOARD_LL As Integer = 13 ' Konstante für WH_KEYBOARD_LL
     
      Public PrevWndProc As Integer
      Private mHandle As IntPtr
     
      <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
      ' Um den Hook ein-/ausschalten zu können:
      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
      ' Hiermit wird der Tastendruck VOR dem Betriebssystem abgefangen:
      ' wParam kann folgende Werte annehmen: 
      ' WM_KEYUP und WM_KEYDOWN (Taste gedrückt/losgelassen)
      ' wird fEatKeyStroke=true gesetzt, so wird dieser Tastendruck "verschluckt", 
      ' d. h. er hat für das System  NIE statt gefunden.
      Private Function KeyboardHookProc(ByVal nCode As Integer, _
        ByVal wParam As IntPtr, _
        ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr
     
        Dim fEatKeyStroke As Boolean
     
        If nCode = HC_ACTION Then
     
          Select Case lParam.vkCode
            ' Hier z.B. die Zeichen a und b nicht zulassen 
            '(fEatKeyStroke = True)
            Case Keys.A
              fEatKeyStroke = True
            Case Keys.B
              fEatKeyStroke = True
          End Select
     
          If fEatKeyStroke Then
            Return New IntPtr(1)
            Exit Function
          End If
     
          Return CallNextHookEx(mHandle, nCode, wParam, lParam)
        End If
      End Function
      Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
     
        ' Hook einschalten:
        KeyHookEnable = True
      End Sub
      Private Sub Form1_Closing(ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
     
        ' WICHTIG! Hook ausschalten beim Beenden nicht vergessen!!!
        KeyHookEnable = False
      End Sub
    End Class

    Dieser Tipp wurde bereits 20.026 mal aufgerufen.

    Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

    Über diesen Tipp im Forum diskutieren
    Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

    Aktuelle Diskussion anzeigen (14 Beiträge)

    nach obenzurück


    Anzeige

    Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
    (einschl. Beispielprojekt!)

    Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
    - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
    - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
    Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
     
       

    Druckansicht Druckansicht Copyright ©2000-2017 vb@rchiv Dieter Otter
    Alle Rechte vorbehalten.
    Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

    Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel