vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Maus & Tastatur · Tastatursteuerung   |   VB-Versionen: VB4, VB5, VB605.11.01
Hotkey systemweit registrieren und abfragen

Dieses Beispiel zeigt, wie sich ein Hotkey systemweit registrieren und abfragen lässt - auch für VB-Programme.

Autor:   F. DzewasBewertung:  Views:  35.813 
ohne HomepageSystem:  Win9x, WinNT, Win2k, Win8, Win10, Win11 Beispielprojekt auf CD 

Dieses Beispielprogramm demonstriert das korrekte Registrieren eines systemweiten Hotkeys. Das Abfragen, ob die registrierte Tastenkombination gedrückt wurde, wird nicht umständlich via Polling realisiert, sondern windows-konform mittels Abfragen der entsprechenden Message.

Mit diesem Code ist es auch für VB Programmierer möglich auf Tastendrücke zu reagieren, ohne dass sich die VB Anwendung im Vordergrund befinden muss.

Fügen Sie zunächst nachfolgenden Code in ein Modul ein:

Option Explicit
 
' ==========================================================
' VB Hotkey Demo. Systemweite Tastenkombination registrieren
' und abfragen
' 
' 03.11.2001 Frank-Oliver Dzewas, software@dzewas.de
' ==========================================================
 
Public Const WM_HOTKEY = &H312
Public Const GWL_WNDPROC = (-4)
Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
Public Const VK_F12 = &H7B
 
Public Declare Function RegisterHotKey Lib "user32" ( _
  ByVal hWnd As Long, _
  ByVal id As Long, _
  ByVal fsModifiers As Long, _
  ByVal vk As Long) As Long
 
Public Declare Function UnregisterHotKey Lib "user32" ( _
  ByVal hWnd As Long, _
  ByVal id As Long) As Long
 
Public Declare Function GetLastError Lib "kernel32" () As Long
 
Public Declare Function SetWindowLong Lib "user32" _
  Alias "SetWindowLongA" ( _
  ByVal hWnd As Long, _
  ByVal nIndex As Long, _
  ByVal dwNewLong As Long) As Long
 
Public Declare Function CallWindowProc Lib "user32" _
  Alias "CallWindowProcA" ( _
  ByVal lpPrevWndFunc As Long, _
  ByVal hWnd As Long, _
  ByVal Msg As Long, _
  ByVal wParam As Long, _
  ByVal lParam As Long) As Long
 
Public Declare Function GlobalAddAtomA Lib "kernel32" ( _
  ByVal lpString As String) As Long
 
Public Declare Function GlobalDeleteAtom Lib "kernel32" ( _
  ByVal nAtom As Long) As Long
 
Public glAddressOfHotKeyPrevWndProc As Long
Public glHotKeyAtom As Long
Public Function HotkeyWndProc(ByVal lHwnd As Long, _
  ByVal lMsg As Long, ByVal lwParam As Long, _
  ByVal lParam As Long) As Long
 
  If lMsg = WM_HOTKEY Then
    ' Hier kommt die Message, wenn die via
    ' "RegisterHotKey" registrierte Tastenkombination
    ' gedrückt wurde...
    MsgBox "Hotkey wurde betätigt", vbInformation Or _
      vbSystemModal
  End If
 
  ' !WndProc aufrufen und Rückgabewert durchreichen!
  HotkeyWndProc = CallWindowProc(glAddressOfHotKeyPrevWndProc, _
    lHwnd, lMsg, lwParam, lParam)
End Function

Und hier der Code für die Form:

Beim Laden der Form wird die gewünschte Tastenkombination (HotKey) registriert. In unserem Beispiel Strg+F12. Egal ob die Anwendung nun den Fokus hat oder sich irgendwo im Hintergrund tummelt - auf die Tastenkombination Strg+F12 kann gezielt eine bestimmte Aktion ausgeführt werden.

' ==========================================================
' VB Hotkey Demo. Systemweite Tastenkombination registrieren
' und abfragen
' 
' 03.11.2001 Frank-Oliver Dzewas, software@dzewas.de
' ==========================================================
Option Explicit
 
 
Private Sub Form_Load()
  ' Systemweit eindeutigen Wert generieren lassen
  glHotKeyAtom = GlobalAddAtomA(CStr(&HBFFF))
  If glHotKeyAtom = 0 Then
    MsgBox "GlobalAddAtomA() fehlgeschlagen" & vbCr & _
      "Fehlercode: " & CStr(GetLastError()), vbExclamation
    End
  End If
 
  ' Hotkey systemweit registrieren.
  ' Hier "Strg + F12"
 
  If RegisterHotKey(Me.hWnd, glHotKeyAtom, MOD_CONTROL, _
    VK_F12) = 0 Then
 
    MsgBox "RegisterHotKey() fehlgeschlagen" & vbCr & _
      "Fehlercode: " & CStr(GetLastError()), vbExclamation
    End
  Else
    ' Wenn Hotkey registriert werden konnte,
    ' wird jetzt die Fensterprozedur umgeleitet,
    ' um die WM_HOTKEY Message abfragen zu können
    glAddressOfHotKeyPrevWndProc = SetWindowLong(Me.hWnd, _
      GWL_WNDPROC, AddressOf HotkeyWndProc)
 
    If glAddressOfHotKeyPrevWndProc = 0 Then
      MsgBox "SetWindowLong() fehlgeschlagen" & vbCr & _
        "Fehlercode: " & CStr(GetLastError()), vbExclamation
      End
    End If
  End If
End Sub

Beim Beenden der Anwendung muss natürlich der systemweite HotKey wieder entfernt werden!

Private Sub Form_Unload(Cancel As Integer)
  ' Hotkey wieder entfernen
  If UnregisterHotKey(Me.hWnd, glHotKeyAtom) = 0 Then
    MsgBox "RegisterHotKey() fehlgeschlagen" & vbCr & _
      "Fehlercode: " & CStr(GetLastError()), vbExclamation
  End If
 
  ' Adresse der Fensterprozedur wieder auf den
  ' ursprüglichen Wert setzen
  If glAddressOfHotKeyPrevWndProc Then
    If SetWindowLong(Me.hWnd, GWL_WNDPROC, _
      glAddressOfHotKeyPrevWndProc) = 0 Then
 
      MsgBox "SetWindowLong() fehlgeschlagen" & vbCr & _
        "Fehlercode: " & CStr(GetLastError()), vbExclamation
    End If
  End If
 
  ' Eindeutigen Wert wieder löschen
  If GlobalDeleteAtom(glHotKeyAtom) <> 0 Then
    MsgBox "GlobalDeleteAtom() fehlgeschlagen" & vbCr & _
      "Fehlercode: " & CStr(GetLastError()), vbExclamation
  End If
End Sub

Sollen mehrere HotKeys registriert werden, schauen Sie sich bitte folgenden Tipp an:
 Mehrere HotKeys systemweit registrieren und abfragen
 



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.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle 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.