RegisterHotKey-Wrapper

    • VB.NET

    Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

      RegisterHotKey-Wrapper

      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 :)
      Also hier der kleine Registerer:

      VB.NET-Quellcode

      1. Public NotInheritable Class Hotkey : Inherits NativeWindow : Implements IDisposable
      2. Private Declare Function RegisterHotKey Lib "user32" ( _
      3. ByVal Hwnd As IntPtr, ByVal ID As Integer, _
      4. ByVal Modifiers As Integer, ByVal Key As Integer) As Integer
      5. Private Declare Function UnregisterHotKey Lib "user32" ( _
      6. ByVal Hwnd As IntPtr, ByVal ID As Integer) As Integer
      7. Public Event Pressed As EventHandler
      8. Public Const WinKey As Keys = DirectCast(Keys.Alt << 1, Keys)
      9. Private _Value As Keys
      10. Public Sub New(Optional ByVal Value As Keys = Keys.None)
      11. Me.CreateHandle(New CreateParams)
      12. TryRegister(Value)
      13. End Sub
      14. Public ReadOnly Property Value() As Keys
      15. Get
      16. Return _Value
      17. End Get
      18. End Property
      19. Public Function TryRegister(ByVal Key As Keys) As Boolean
      20. Dim ApiModifier = 0
      21. If CBool(Key And WinKey) Then ApiModifier += 8
      22. If CBool(Key And Keys.Shift) Then ApiModifier += 4
      23. If CBool(Key And Keys.Control) Then ApiModifier += 2
      24. If CBool(Key And Keys.Alt) Then ApiModifier += 1
      25. 'Für die API-Registrierung die Modifier-Komponente (oberhalb &HFFFF)
      26. ' der Keys-Enumeration wegmaskieren
      27. Dim unregistered = UnregisterHotKey(Me.Handle, _Value)
      28. If Key = Keys.None Then Return True
      29. Debug.WriteLine(unregistered.ToString)
      30. If RegisterHotKey(Me.Handle, Key, ApiModifier, Key And &HFFFF) = 0 Then Return False
      31. _Value = Key
      32. Return True
      33. End Function
      34. Protected Overrides Sub WndProc(ByRef m As Message)
      35. Const WM_HOTKEY As Integer = &H312
      36. If m.Msg = WM_HOTKEY Then RaiseEvent Pressed(Me, EventArgs.Empty)
      37. MyBase.WndProc(m)
      38. End Sub
      39. Public Sub Dispose() Implements IDisposable.Dispose
      40. If Me.Handle = IntPtr.Zero Then Return
      41. If UnregisterHotKey(Me.Handle, _Value) = 0 Then Stop
      42. Me.ReleaseHandle()
      43. End Sub
      44. 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 :)
      Dateien

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

      Nach- /Vorteil wäre, dass du bei nem Tastaturhook (wo die Taste dann abgefangen wird) auf eine Taste mehrere Funktionen "binden" kannst und dann bei zwei Anwendungen mit dem gleichen Hotkey bei beiden etwas ausführst was z.B. nicht so praktisch wäre.