Sprache: VB
Mit dieser Klasse kann man sehr leicht eine globale Hotkey funktionalität in seinem Programm einbinden.
Man muss nur diese Klasse mit WithEvents deklarieren und ihr eine Form zuweisen die gesubclassed werden soll.
Dann muss man nur noch ein paar eigene HotKey-Kombinationen registrieren (z.B. Strg+Alt+X) und diese
mit dem Event abfragen bzw, abfangen. Dazu muss man eine eigene HotKeyID angeben um einen bestimmte HotKey
Kombination später zu identifizieren wenn diese gedrückt wird. Wenn man z.B. eine Kombination registriert
und ihr z.B. die HotKeyID "TEST1" zugewiesen wird, dann kann man später im Event nach dieser ID "TEST1" fragen
und dann eine Funktion aufrufen die für diesen HotKey bestimmt wurde.
PS: Globale Hotkeys sind globale Tastenkombinationen wie z.B. Strg+Alt+Entf. Das heißt diese sind überall in Windows verfügbar, auch während eines Spiels etc. Man muss nicht unbedingt immer 3 Tasten zuweisen man brauch jedoch ein Modifier (Strg,Alt,Shift oder Win) und eine normale Taste wie z.B. Alt+X oder Shift+Y.
Achtung: wenn man mehrere Modifier Tasten oder normale Tasten verwenden will z.B. für eine solche Kombination: Strg+Alt+Shift+X dann muss man diese mit OR verknüpfen:
AddHotKey(Keys.X, MODKEY.MOD_CONTROL Or MODKEY.MOD_ALT Or MODKEY.MOD_SHIFT "HK_1")
''' <summary>
''' Mit dieser Klasse kann man sehr leicht eine globale Hotkey funktionalität in seinem Programm einbinden.
''' Man muss nur diese Klasse mit WithEvents deklarieren und ihr eine Form zuweisen die gesubclassed werden soll.
''' Dann muss man nur noch ein paar eigene HotKey-Kombinationen registrieren (z.B. Strg+Alt+X) und diese
''' mit dem Event abfragen bzw, abfangen. Dazu muss man eine eigene HotKeyID angeben um einen bestimmte HotKey
''' Kombination später zu identifizieren wenn diese gedrückt wird. Wenn man z.B. eine Kombination registriert
''' und ihr z.B. die HotKeyID "TEST1" zugewiesen wird, dann kann man später im Event nach dieser ID "TEST1" fragen
''' und dann eine Funktion aufrufen die für diesen HotKey bestimmt wurde.
''' </summary>
''' <remarks>Tim Hartwig</remarks>
Public Class clsHotKey
Implements IMessageFilter
Private Declare Function RegisterHotKey Lib "user32" ( _
ByVal Hwnd As IntPtr, _
ByVal ID As Integer, _
ByVal Modifiers As Integer, _
ByVal Key As Integer) _
As Integer
Private Declare Function UnregisterHotKey Lib "user32" ( _
ByVal Hwnd As IntPtr, _
ByVal ID As Integer) _
As Integer
Private Declare Function GlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" ( _
ByVal IDString As String) _
As Short
Private Declare Function GlobalDeleteAtom Lib "kernel32" ( _
ByVal Atom As Short) _
As Short
Public Class HotKeyObject
Private mHotKey As Keys
Private mModifier As MODKEY
Private mHotKeyID As String
Private mAtomID As Short
Public Property HotKey() As Keys
Get
Return mHotKey
End Get
Set(ByVal value As Keys)
mHotKey = value
End Set
End Property
Public Property Modifier() As MODKEY
Get
Return mModifier
End Get
Set(ByVal value As MODKEY)
mModifier = value
End Set
End Property
Public Property HotKeyID() As String
Get
Return mHotKeyID
End Get
Set(ByVal value As String)
mHotKeyID = value
End Set
End Property
Public Property AtomID() As Short
Get
Return mAtomID
End Get
Set(ByVal value As Short)
mAtomID = value
End Set
End Property
Sub New(ByVal NewHotKey As Keys, ByVal NewModifier As MODKEY, ByVal NewHotKeyID As String)
mHotKey = NewHotKey
mModifier = NewModifier
mHotKeyID = NewHotKeyID
End Sub
End Class
Private mForm As Form
Private Const WM_HOTKEY As Integer = &H312
Private mHotKeyList As New System.Collections.Generic.Dictionary(Of Short, HotKeyObject)
Private mHotKeyIDList As New System.Collections.Generic.Dictionary(Of String, Short)
''' <summary>
''' Diesem Event wird immer die zugewiesene HotKeyID übergeben wenn eine HotKey Kombination gedrückt wurde.
''' </summary>
Public Event HotKeyPressed(ByVal HotKeyID As String)
Public Enum MODKEY As Integer
MOD_ALT = 1
MOD_CONTROL = 2
MOD_SHIFT = 4
MOD_WIN = 8
End Enum
Sub New(ByVal OwnerForm As Form)
mForm = OwnerForm
Application.AddMessageFilter(Me)
End Sub
''' <summary>
''' Diese Funktion fügt einen Hotkey hinzu und registriert ihn auch sofort
''' </summary>
''' <param name="KeyCode">Den KeyCode für die Taste</param>
''' <param name="Modifiers">Die Zusatztasten wie z.B. Strg oder Alt, diese können auch mit OR kombiniert werden</param>
''' <param name="HotKeyID">Die ID die der Hotkey bekommen soll um diesen zu identifizieren</param>
Public Sub AddHotKey(ByVal KeyCode As Keys, ByVal Modifiers As MODKEY, ByVal HotKeyID As String)
If mHotKeyIDList.ContainsKey(HotKeyID) = True Then Exit Sub
Dim ID As Short = GlobalAddAtom(HotKeyID)
mHotKeyIDList.Add(HotKeyID, ID)
mHotKeyList.Add(ID, New HotKeyObject(KeyCode, Modifiers, HotKeyID))
RegisterHotKey(mForm.Handle, ID, mHotKeyList(ID).Modifier, mHotKeyList(ID).HotKey)
End Sub
''' <summary>
''' Diese Funktion entfernt einen Hotkey und deregistriert ihn auch sofort
''' </summary>
''' <param name="HotKeyID">Gibt die HotkeyID an welche entfernt werden soll</param>
Public Sub RemoveHotKey(ByVal HotKeyID As String)
If mHotKeyIDList.ContainsKey(HotKeyID) = False Then Exit Sub
Dim ID As Short = mHotKeyIDList(HotKeyID)
mHotKeyIDList.Remove(HotKeyID)
mHotKeyList.Remove(ID)
UnregisterHotKey(mForm.Handle, CInt(ID))
GlobalDeleteAtom(ID)
End Sub
Private Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
If m.Msg = WM_HOTKEY Then
RaiseEvent HotKeyPressed(mHotKeyList(CShort(m.WParam)).HotKeyID)
End If
End Function
End Class
''' <summary>
''' Mit dieser Klasse kann man sehr leicht eine globale Hotkey funktionalität in seinem Programm einbinden.
''' Man muss nur diese Klasse mit WithEvents deklarieren und ihr eine Form zuweisen die gesubclassed werden soll.
''' Dann muss man nur noch ein paar eigene HotKey-Kombinationen registrieren (z.B. Strg+Alt+X) und diese
''' mit dem Event abfragen bzw, abfangen. Dazu muss man eine eigene HotKeyID angeben um einen bestimmte HotKey
''' Kombination später zu identifizieren wenn diese gedrückt wird. Wenn man z.B. eine Kombination registriert
''' und ihr z.B. die HotKeyID "TEST1" zugewiesen wird, dann kann man später im Event nach dieser ID "TEST1" fragen
''' und dann eine Funktion aufrufen die für diesen HotKey bestimmt wurde.
''' </summary>
''' <remarks>Tim Hartwig</remarks>
Public Class clsHotKey
Implements IMessageFilter
Private Declare Function RegisterHotKey Lib "user32" ( _
ByVal Hwnd As IntPtr, _
ByVal ID As Integer, _
ByVal Modifiers As Integer, _
ByVal Key As Integer) _
As Integer
Private Declare Function UnregisterHotKey Lib "user32" ( _
ByVal Hwnd As IntPtr, _
ByVal ID As Integer) _
As Integer
Private Declare Function GlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" ( _
ByVal IDString As String) _
As Short
Private Declare Function GlobalDeleteAtom Lib "kernel32" ( _
ByVal Atom As Short) _
As Short
Public Class HotKeyObject
Private mHotKey As Keys
Private mModifier As MODKEY
Private mHotKeyID As String
Private mAtomID As Short
Public Property HotKey() As Keys
Get
Return mHotKey
End Get
Set(ByVal value As Keys)
mHotKey = value
End Set
End Property
Public Property Modifier() As MODKEY
Get
Return mModifier
End Get
Set(ByVal value As MODKEY)
mModifier = value
End Set
End Property
Public Property HotKeyID() As String
Get
Return mHotKeyID
End Get
Set(ByVal value As String)
mHotKeyID = value
End Set
End Property
Public Property AtomID() As Short
Get
Return mAtomID
End Get
Set(ByVal value As Short)
mAtomID = value
End Set
End Property
Sub New(ByVal NewHotKey As Keys, ByVal NewModifier As MODKEY, ByVal NewHotKeyID As String)
mHotKey = NewHotKey
mModifier = NewModifier
mHotKeyID = NewHotKeyID
End Sub
End Class
Private mForm As Form
Private Const WM_HOTKEY As Integer = &H312
Private mHotKeyList As New System.Collections.Generic.Dictionary(Of Short, HotKeyObject)
Private mHotKeyIDList As New System.Collections.Generic.Dictionary(Of String, Short)
''' <summary>
''' Diesem Event wird immer die zugewiesene HotKeyID übergeben wenn eine HotKey Kombination gedrückt wurde.
''' </summary>
Public Event HotKeyPressed(ByVal HotKeyID As String)
Public Enum MODKEY As Integer
MOD_ALT = 1
MOD_CONTROL = 2
MOD_SHIFT = 4
MOD_WIN = 8
End Enum
Sub New(ByVal OwnerForm As Form)
mForm = OwnerForm
Application.AddMessageFilter(Me)
End Sub
''' <summary>
''' Diese Funktion fügt einen Hotkey hinzu und registriert ihn auch sofort
''' </summary>
''' <param name="KeyCode">Den KeyCode für die Taste</param>
''' <param name="Modifiers">Die Zusatztasten wie z.B. Strg oder Alt, diese können auch mit OR kombiniert werden</param>
''' <param name="HotKeyID">Die ID die der Hotkey bekommen soll um diesen zu identifizieren</param>
Public Sub AddHotKey(ByVal KeyCode As Keys, ByVal Modifiers As MODKEY, ByVal HotKeyID As String)
If mHotKeyIDList.ContainsKey(HotKeyID) = True Then Exit Sub
Dim ID As Short = GlobalAddAtom(HotKeyID)
mHotKeyIDList.Add(HotKeyID, ID)
mHotKeyList.Add(ID, New HotKeyObject(KeyCode, Modifiers, HotKeyID))
RegisterHotKey(mForm.Handle, ID, mHotKeyList(ID).Modifier, mHotKeyList(ID).HotKey)
End Sub
''' <summary>
''' Diese Funktion entfernt einen Hotkey und deregistriert ihn auch sofort
''' </summary>
''' <param name="HotKeyID">Gibt die HotkeyID an welche entfernt werden soll</param>
Public Sub RemoveHotKey(ByVal HotKeyID As String)
If mHotKeyIDList.ContainsKey(HotKeyID) = False Then Exit Sub
Dim ID As Short = mHotKeyIDList(HotKeyID)
mHotKeyIDList.Remove(HotKeyID)
mHotKeyList.Remove(ID)
UnregisterHotKey(mForm.Handle, CInt(ID))
GlobalDeleteAtom(ID)
End Sub
Private Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
If m.Msg = WM_HOTKEY Then
RaiseEvent HotKeyPressed(mHotKeyList(CShort(m.WParam)).HotKeyID)
End If
End Function
End Class
Alte URL:
/snippet/globale-hotkeys-tastenkombinationen/245
Hervorragende Klasse! Einfach einzubinden, gut anzusprechen.
Für einen ungeübten Programmierer wie mich wäre es hilfreich, noch zwei Beispielzeilen zur Einbindung vorzufinden, was ich hiermit beisteuere:
[code]
‚Deklarieren der Klasse in einer Form
Dim WithEvents HotKey As New clsHotKey(Me)
‚Registrieren der Hotkeys
HotKey.AddHotKey(Keys.F11, clsHotKey.MODKEY.MOD_CONTROL, „SaveScreenShot“)
‚Eingang des Hotkey-Events abfragen
Private Sub ReceiveHotKey(ByVal HotKeyID As String) Handles HotKey.HotKeyPressed
…
End Sub
[/code]
Das freut mich das dir diese Klasse gefällt!
Bist Du Tim Hartwig? Wenn ja, warum ein Copyright auf ein Snippet? Snippets sind zum kopieren da. Wenn nein, hast Du die Erlaubnis vom Urheber, dass Du diesen Code veröffentlichen darfst?
Natürlich bin ich Tim Hartwig und ich mache bei allen größeren Klassen mein Copyright rein. Und ja ihr dürft mein Snippet ohne Erlaubnis benutzen, aber ich bitte stets um einen Hinweis in eurem Programm das ihr meine Klassen benutzt und vielleicht auch ein Nachricht an mich. Danke!
Dann ist ja alles ok. Ich frage nur lieber immer nach.
Einfach Genail. Konnte ich gut in meinem Programm einbauen, ein großes Lob an den Programmierer.
Prima, was hier auch für VB2005 Anfänger wie mich geboten wird. Dieses hier funktionierte auf Anhieb. Jetzt möchte ich mir aber ein kleine Konfigurations-Routine schreiben und Sondertasten + auszuführende Funktion in eine *.INI etc. ablegen.
Das Problem, wie kann ich nach starten des Programms und auslesen einer *.INI HotKey-Kombinationen registrieren, also diese Zeile:
HotKey.AddHotKey(Keys.F11, clsHotKey.MDKEY.MOD_CONTROL, „TEST1“)
erzeugen.
MfG
Ich habe hier ein kleines Problem
ich habe folgenden Code verwendet:
[code]
‚# Deklarieren der Klasse in einer Form
Dim WithEvents HotKey As New clsHotKey(Me)
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim frm As New SplashScreen1
frm.ShowDialog(Me)
‚Registrieren der Hotkeys
HotKey.AddHotKey(Keys.F11, clsHotKey.MODKEY.MOD_WIN, „ID1“)
End Sub
‚Eingang des Hotkey-Events abfragen
Private Sub ReceiveHotKey(ByVal HotKeyID As String) Handles HotKey.HotKeyPressed
If HotKeyID = „ID1“ Then
MsgBox(„OK“, MsgBoxStyle.SystemModal)
Call setBigWindow()
End If
End Sub[/code]
Wenn ich das Programm einmal in den Systray Minimiere funktioniert der hotkey nicht mehr.
Woran kann das liegen, ansonsten funktioniert es fehlerfrei, Systemweit.