VB2008
Um FAtheone zu ärgern stelle ich hier mal meinen RegisterHotkey-Wrapper ein ;). Ich hab einen besonders kleinen, der registriert genau einen Hotkey, und einen, mit dem man auch mehrere Hotkeys registrieren kann.
Die Registrierung erfolgt durch "TryRegister()", und wenn das False zurückgibt, ist die Registrierung fehlgeschlagen. Sowas kommt vor, wenn zB. eine andere App den Key schon registriert hat, oder wenn man einer Verknüpfung auf dem Desktop über Verknüpfungs-Eigenschaften einen Hotkey zugeordnet hat.
Ausserdem kann man auch Tastenkombis registrieren, die die Windows-Taste enthalten.
Das Gewurstel mit RegisterAtom etc., welches FAtheone und MSDN vorführen, ist unnötig. Windows verhindert ein mehrfaches registrieren derselben Tastenkombi, und von daher ist die Tastenkombi selbst automatisch ein perfekter Schlüssel - denn kann ja nicht doppelt vorkommen![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
Also hier der kleine Registerer:
Das Prinzip ist, es erbt von NativeWindow. Das ist ein Window, das kann gar nicht angezeigt werden, ist aber immerhin imstande WindowMessages zu empfangen, und in der WndProc-Überschreibung verfügbar zu machen, und mehr wollemer ja garnicht ;).
Upsala: Grad findich in den Tuts ein altes Werk von und mikeb69.
Das kann zwar nicht den ganzen Schnickschnack von diesem hier (registrieren, deregistrieren, vom user einstellbare Keys, Fehlermeldung), ist dafür aber leicht verständlich.
Auch benutzt mikeb69 einfach das Form-Handle, während ich meinem Wrapper ein eigenes NativeWindow spendiere - das würde also auch worken, wenn gar kein Form da ist.
Och naja - wennich mike69s Code richtig verstehe, hatter nix eingabaut, um Modifier-Keys zu identifizieren (shift, strg, alt) - von daher hat dies Teil doch noch seine Daseinsberechtigung
Um FAtheone zu ärgern stelle ich hier mal meinen RegisterHotkey-Wrapper ein ;). Ich hab einen besonders kleinen, der registriert genau einen Hotkey, und einen, mit dem man auch mehrere Hotkeys registrieren kann.
Die Registrierung erfolgt durch "TryRegister()", und wenn das False zurückgibt, ist die Registrierung fehlgeschlagen. Sowas kommt vor, wenn zB. eine andere App den Key schon registriert hat, oder wenn man einer Verknüpfung auf dem Desktop über Verknüpfungs-Eigenschaften einen Hotkey zugeordnet hat.
Ausserdem kann man auch Tastenkombis registrieren, die die Windows-Taste enthalten.
Das Gewurstel mit RegisterAtom etc., welches FAtheone und MSDN vorführen, ist unnötig. Windows verhindert ein mehrfaches registrieren derselben Tastenkombi, und von daher ist die Tastenkombi selbst automatisch ein perfekter Schlüssel - denn kann ja nicht doppelt vorkommen
![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
Also hier der kleine Registerer:
VB.NET-Quellcode
- Public NotInheritable Class Hotkey : Inherits NativeWindow : Implements IDisposable
- 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
- Public Event Pressed As EventHandler
- Public Const WinKey As Keys = DirectCast(Keys.Alt << 1, Keys)
- Private _Value As Keys
- Public Sub New(Optional ByVal Value As Keys = Keys.None)
- Me.CreateHandle(New CreateParams)
- TryRegister(Value)
- End Sub
- Public ReadOnly Property Value() As Keys
- Get
- Return _Value
- End Get
- End Property
- Public Function TryRegister(ByVal Key As Keys) As Boolean
- Dim ApiModifier = 0
- If CBool(Key And WinKey) Then ApiModifier += 8
- If CBool(Key And Keys.Shift) Then ApiModifier += 4
- If CBool(Key And Keys.Control) Then ApiModifier += 2
- If CBool(Key And Keys.Alt) Then ApiModifier += 1
- 'Für die API-Registrierung die Modifier-Komponente (oberhalb &HFFFF)
- ' der Keys-Enumeration wegmaskieren
- Dim unregistered = UnregisterHotKey(Me.Handle, _Value)
- If Key = Keys.None Then Return True
- Debug.WriteLine(unregistered.ToString)
- If RegisterHotKey(Me.Handle, Key, ApiModifier, Key And &HFFFF) = 0 Then Return False
- _Value = Key
- Return True
- End Function
- Protected Overrides Sub WndProc(ByRef m As Message)
- Const WM_HOTKEY As Integer = &H312
- If m.Msg = WM_HOTKEY Then RaiseEvent Pressed(Me, EventArgs.Empty)
- MyBase.WndProc(m)
- End Sub
- Public Sub Dispose() Implements IDisposable.Dispose
- If Me.Handle = IntPtr.Zero Then Return
- If UnregisterHotKey(Me.Handle, _Value) = 0 Then Stop
- Me.ReleaseHandle()
- End Sub
- End Class
Das Prinzip ist, es erbt von NativeWindow. Das ist ein Window, das kann gar nicht angezeigt werden, ist aber immerhin imstande WindowMessages zu empfangen, und in der WndProc-Überschreibung verfügbar zu machen, und mehr wollemer ja garnicht ;).
Upsala: Grad findich in den Tuts ein altes Werk von und mikeb69.
Das kann zwar nicht den ganzen Schnickschnack von diesem hier (registrieren, deregistrieren, vom user einstellbare Keys, Fehlermeldung), ist dafür aber leicht verständlich.
Auch benutzt mikeb69 einfach das Form-Handle, während ich meinem Wrapper ein eigenes NativeWindow spendiere - das würde also auch worken, wenn gar kein Form da ist.
Och naja - wennich mike69s Code richtig verstehe, hatter nix eingabaut, um Modifier-Keys zu identifizieren (shift, strg, alt) - von daher hat dies Teil doch noch seine Daseinsberechtigung
![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()