Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0411: Komplexe Tastenkombination als Hotkey registrieren

 von 

Beschreibung 

Mit Tipp 154 läßt sich zwar ebenfalls ein Hotkey registrieren, allerdings sind dort zusammengesetzte Hotkeys nicht möglich. Im hier gezeigten Tipp wird hingegen z.B. der Shortcut [Strg] + [Alt] + [F8] ermöglicht.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

CallWindowProcA (CallWindowProc), GlobalAddAtomA (GlobalAddAtom), GlobalDeleteAtom, RegisterHotKey, SetWindowLongA (SetWindowLong), UnregisterHotKey

Download:

Download des Beispielprojektes [3,58 KB]

'Dieser Quellcode 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!

'------------- Anfang Projektdatei Project1.vbp -------------
' Die Komponente 'Microsoft Windows Common Controls 5.0 (SP2) (comctl32.ocx)' wird benötigt.

'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label5"


'Autor: Kopczynski
'E-Mail: D.Copy@gmx.de

Option Explicit

Private Sub Form_Load()
    Call SetHotKey(Me.hWnd, &H1 + &H2, &H77)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call RemoveHotKey
End Sub

Private Sub Command1_Click()
    App.TaskVisible = False
    Me.Hide
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Modul "Module1" alias Module1.bas ---------

Option Explicit

Private Declare Function RegisterHotKey Lib "user32" (ByVal _
        hWnd As Long, ByVal id As Long, ByVal fsModifiers As _
        Long, ByVal vk As Long) As Long
        
Private Declare Function UnregisterHotKey Lib "user32" (ByVal _
        hWnd As Long, ByVal id As Long) As Long

Private 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
        
Private Declare Function SetWindowLong Lib "user32" Alias _
        "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex _
        As Long, ByVal dwNewLong As Long) As Long

Private Declare Function GlobalDeleteAtom Lib "kernel32" _
        (ByVal nAtom As Integer) As Integer
        
Private Declare Function GlobalAddAtom Lib "kernel32" Alias _
        "GlobalAddAtomA" (ByVal lpString As String) As Integer

Const GWL_WNDPROC As Long = (-4&)
Const WM_HOTKEY As Long = &H312&

Public Enum ModKeys
    MOD_ALT = &H1
    MOD_CONTROL = &H2
    MOD_SHIFT = &H4
    MOD_WIN = &H8
End Enum

Private OldProc As Long, hOwner As Long
Private iAtom As Integer

Public Sub SetHotKey(hWnd As Long, ModKey As ModKeys, _
                          vKey As Long)
    
    hOwner = hWnd
    
    iAtom = GlobalAddAtom("MyHotKey")
    Call RegisterHotKey(hOwner, iAtom, ModKey, vKey)
    
    OldProc = SetWindowLong(hOwner, GWL_WNDPROC, _
              AddressOf WndProc)
    
End Sub

Public Sub RemoveHotKey()
    If hOwner = 0 Then Exit Sub
    Call UnregisterHotKey(hOwner, iAtom)
    Call SetWindowLong(hOwner, GWL_WNDPROC, OldProc)
    Call GlobalDeleteAtom(iAtom)
End Sub

Public Function WndProc(ByVal hWnd As Long, _
        ByVal wMsg As Long, ByVal wParam As Long, _
        ByVal lParam As Long) As Long
                        
    If wMsg = WM_HOTKEY And wParam = iAtom Then
        Form1.Show
    Else
        WndProc = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)
    End If
End Function
'---------- Ende Modul "Module1" alias Module1.bas ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 9 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Alien am 12.12.2004 um 02:08

bei removehotkey sollte diese zeile noch eingeführt werden

Call CallWindowProc(OldProc, 0&, 0&, 0&, 0&)
damit wird die Callbackfunktion rausgeworfen ansonsten kann es sein das das programm nicht richtig terminiert.

aber ansonsten guter tip einfach schnell gut

Kommentar von Alex Mühlbauer am 14.06.2004 um 14:30

Hallo,

genau diese Anleitung habe ich gesucht. Echt super, vielen Dank. Leider kann ich immer nur eine Taste als Hotkey systemweit festlegen, ich würde jedoch gerne alle Funktionstasten belegen. Wie geht das denn?

Gruß
Alex Mühlbauer

Kommentar von RDraxl am 25.04.2002 um 14:45

Und wie schaff ich es jetzt, das so hinzudrehen, dass wenn ich den Hotkey drücke, er alles so macht, als ob ich Command1 geklickt hätte ?

Kommentar von PhilippVB am 19.04.2002 um 21:49

An Miles: Addressen der Tasten: Alle Kostanten sind in VB von Haus aus schon definiert! Es sind die Konstanten die mit "vbKey..." beginnen, im Beispiel wäre es vbKeyF8.

Kommentar von Timo am 20.03.2002 um 12:38

Woran kann es liegen, daß mein Programm einen Kernel32 Fehler erzeugt, wenn ich es beende?
Ich habe extra einen Beenden-Knopf in meinem Programm, der "Call RemoveHotKey" aufruft, aber trotzallem stürzt VB mit einer Kernel32-Fehlermeldung ab.
Wenn ich aber "Call RemoveHotKey" gleich hinter "Call SetHotKey" im Form_Load setze oder irgendwo mitten im Programm "RemoveHotKey" in einen Button einbaue, funktioniert alles einwandfrei.
Verstehe das nicht.
Gruss
Timo

Kommentar von Carsten am 05.02.2002 um 16:29

Habe ein kleines Modul (für die WndProc) und ein Klassenmodul (zum hinzufügen von Hotkeys) erstellt.
Damit kann man mehrere Hotkeys belegen und diese dann in WndProc mit Funktionen zuweisen.
Ich werde an diesem Projekt noch etwas herumbasteln. Vielleicht bekomme ich es noch mit Events hin so das man Hotkeys erstellen und diese in der Form als Event reagieren z.B.
HK.AddHotKeys("Weg", Me.hWnd,MOD_Shift,vbKeyF1)
Sub Form1_Weg()
Me.Hide
End Sub
Carsten

Kommentar von Miles am 27.11.2001 um 15:20

Wie bekomme ich die Adressen der Tasten raus???
Miles

Kommentar von Götz Reinecke am 15.06.2001 um 11:45

Hallo Markus, ja, Du kannst anstelle des Form1.Show im Modul auch eine andere Funktion einbauen.
Grüße
Götz

Kommentar von Markus Palme am 15.06.2001 um 11:42

Ist es auch möglich auf das Drücken der Hotkeys gezielt zu reagieren ?