Hotkey erkennung

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Hotkey erkennung

    Hallo Leute, ich wollte meinem Programm die Möglichkeit geben es mehr zu personalisieren. Dafür wollte ich die Möglichkeit bieten bestimmte Funktionen auf bestimmte Tasten legen zu können. Muss ich dafür echt nen komplizierten Global Keyhook machen? Und kann ich die tasten IM Programm speichern lassen?

    Also sagen wir so:

    Ein User möchte die Taste F1 mit einer funktion belegen, so soll F1 beim Drücken automatisch erkannt werden und dann im Programm gespeichert werden.

    liebe grüße :)
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    Ganz ohne kompliziert gehts nicht.
    Andererseits ein Global KeyHook ist ja garnet was du wolle, du willst ja nur Tastendrücke deiner Anwendung.
    Eine Möglichkeit ist Application.AddMessageFilter() - das horcht sämtliche WindowMessages deiner Anwendung ab.
    Aber da musste immer noch mit WindowMessages herumhühnern und analysieren.

    Naja, und speichern kann man alles.
    Also alles an Daten kann man speichern - die Taste F1 selber kannste natürlich nicht speichern.
    @C.O.D.E Wenn Du in der Form bleibst, kannst Du der ein MenuStrip hinzufügen. Dieses bekommt ToolStripMenuItems und die haben eine Property ShortcutKeys.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hatte es jetzt so probiert:

    Hatte den code hier im Forum gefunden und ihn kopiert und erweitert.


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer, ByVal fsModifier As Integer, ByVal vk As Integer) As Integer
    3. Private Declare Sub UnregisterHotKey Lib "user32" (ByVal hWnd As IntPtr, ByVal id As Integer)
    4. Private Const Key_NONE As Integer = &H0
    5. Private Const WM_HOTKEY As Integer = &H312
    6. Protected Overrides Sub WndProc(ByRef m As Message)
    7. 'die messages auswerten
    8. If m.Msg = WM_HOTKEY Then
    9. 'hier wird entschieden welcher hotkey es war
    10. 'einfach die übergebene id auswerten
    11. Select Case m.WParam
    12. Case 1
    13. MessageBox.Show("Sie haben die 1 gedrückt!")
    14. End Select
    15. End If
    16. MyBase.WndProc(m)
    17. End Sub
    18. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    19. For i = 1 To 69
    20. UnregisterHotKey(Me.Handle, i)
    21. Next
    22. End Sub
    23. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    24. 'Zahlen
    25. RegisterHotKey(Me.Handle, 1, Key_NONE, Keys.D1)
    26. RegisterHotKey(Me.Handle, 2, Key_NONE, Keys.D2)
    27. RegisterHotKey(Me.Handle, 3, Key_NONE, Keys.D3)
    28. RegisterHotKey(Me.Handle, 4, Key_NONE, Keys.D4)
    29. RegisterHotKey(Me.Handle, 5, Key_NONE, Keys.D5)
    30. RegisterHotKey(Me.Handle, 6, Key_NONE, Keys.D6)
    31. RegisterHotKey(Me.Handle, 7, Key_NONE, Keys.D7)
    32. RegisterHotKey(Me.Handle, 8, Key_NONE, Keys.D8)
    33. RegisterHotKey(Me.Handle, 9, Key_NONE, Keys.D9)
    34. RegisterHotKey(Me.Handle, 10, Key_NONE, Keys.D0)
    35. 'F-Tasten
    36. RegisterHotKey(Me.Handle, 11, Key_NONE, Keys.F1)
    37. RegisterHotKey(Me.Handle, 12, Key_NONE, Keys.F2)
    38. RegisterHotKey(Me.Handle, 13, Key_NONE, Keys.F3)
    39. RegisterHotKey(Me.Handle, 14, Key_NONE, Keys.F4)
    40. RegisterHotKey(Me.Handle, 15, Key_NONE, Keys.F5)
    41. RegisterHotKey(Me.Handle, 16, Key_NONE, Keys.F6)
    42. RegisterHotKey(Me.Handle, 17, Key_NONE, Keys.F7)
    43. RegisterHotKey(Me.Handle, 18, Key_NONE, Keys.F8)
    44. RegisterHotKey(Me.Handle, 19, Key_NONE, Keys.F9)
    45. RegisterHotKey(Me.Handle, 20, Key_NONE, Keys.F10)
    46. RegisterHotKey(Me.Handle, 21, Key_NONE, Keys.F11)
    47. RegisterHotKey(Me.Handle, 22, Key_NONE, Keys.F12)
    48. 'Alphabet
    49. RegisterHotKey(Me.Handle, 23, Key_NONE, Keys.A)
    50. RegisterHotKey(Me.Handle, 24, Key_NONE, Keys.B)
    51. RegisterHotKey(Me.Handle, 25, Key_NONE, Keys.C)
    52. RegisterHotKey(Me.Handle, 26, Key_NONE, Keys.D)
    53. RegisterHotKey(Me.Handle, 27, Key_NONE, Keys.E)
    54. RegisterHotKey(Me.Handle, 28, Key_NONE, Keys.F)
    55. RegisterHotKey(Me.Handle, 29, Key_NONE, Keys.G)
    56. RegisterHotKey(Me.Handle, 30, Key_NONE, Keys.H)
    57. RegisterHotKey(Me.Handle, 31, Key_NONE, Keys.I)
    58. RegisterHotKey(Me.Handle, 32, Key_NONE, Keys.J)
    59. RegisterHotKey(Me.Handle, 33, Key_NONE, Keys.K)
    60. RegisterHotKey(Me.Handle, 34, Key_NONE, Keys.L)
    61. RegisterHotKey(Me.Handle, 35, Key_NONE, Keys.M)
    62. RegisterHotKey(Me.Handle, 36, Key_NONE, Keys.N)
    63. RegisterHotKey(Me.Handle, 37, Key_NONE, Keys.O)
    64. RegisterHotKey(Me.Handle, 38, Key_NONE, Keys.P)
    65. RegisterHotKey(Me.Handle, 39, Key_NONE, Keys.Q)
    66. RegisterHotKey(Me.Handle, 40, Key_NONE, Keys.R)
    67. RegisterHotKey(Me.Handle, 41, Key_NONE, Keys.S)
    68. RegisterHotKey(Me.Handle, 42, Key_NONE, Keys.T)
    69. RegisterHotKey(Me.Handle, 43, Key_NONE, Keys.U)
    70. RegisterHotKey(Me.Handle, 44, Key_NONE, Keys.V)
    71. RegisterHotKey(Me.Handle, 45, Key_NONE, Keys.W)
    72. RegisterHotKey(Me.Handle, 46, Key_NONE, Keys.X)
    73. RegisterHotKey(Me.Handle, 47, Key_NONE, Keys.Y)
    74. RegisterHotKey(Me.Handle, 48, Key_NONE, Keys.Z)
    75. 'Spezielle Tasten
    76. RegisterHotKey(Me.Handle, 48, Key_NONE, Keys.Escape)
    77. RegisterHotKey(Me.Handle, 50, Key_NONE, Keys.Tab)
    78. RegisterHotKey(Me.Handle, 51, Key_NONE, Keys.CapsLock)
    79. RegisterHotKey(Me.Handle, 52, Key_NONE, Keys.Shift)
    80. RegisterHotKey(Me.Handle, 53, Key_NONE, Keys.Control)
    81. RegisterHotKey(Me.Handle, 54, Key_NONE, Keys.Alt)
    82. RegisterHotKey(Me.Handle, 55, Key_NONE, Keys.Up)
    83. RegisterHotKey(Me.Handle, 56, Key_NONE, Keys.Down)
    84. RegisterHotKey(Me.Handle, 57, Key_NONE, Keys.Left)
    85. RegisterHotKey(Me.Handle, 58, Key_NONE, Keys.Right)
    86. RegisterHotKey(Me.Handle, 59, Key_NONE, Keys.Insert)
    87. RegisterHotKey(Me.Handle, 60, Key_NONE, Keys.Delete)
    88. RegisterHotKey(Me.Handle, 61, Key_NONE, Keys.PageUp)
    89. RegisterHotKey(Me.Handle, 62, Key_NONE, Keys.PageDown)
    90. RegisterHotKey(Me.Handle, 63, Key_NONE, Keys.Pause)
    91. RegisterHotKey(Me.Handle, 64, Key_NONE, Keys.Enter)
    92. RegisterHotKey(Me.Handle, 65, Key_NONE, Keys.Back)
    93. End Sub
    94. End Class


    So könnte ich theoretisch die Tastatur abhören ob irgendeine taste gedrückt wird. Und müsste dies dann nur festhalten.

    Kann ich aber jetzt statt jede einzelne Zahl bei m.WParam abzufragen mir nciht direkt den Key ausgeben lassen?
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „C.O.D.E“ ()

    C.O.D.E schrieb:

    nciht direkt den Key ausgeben lassen?
    Geht nur dann, wenn Dein Fenster den Fokus hat.
    Und:
    Was soll das ganze?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mein Programm hat verschiedene Funktionen wie z.B. die Funktion das man einen Screenshot von einen bestimmten Bereich Screenshoten kann. Diese sind standartmäßig mit einer der F-Tasten als Hotkey belegt. Zum beispiel die F1-Taste als Screenshot Taste. Nun möchte ich aber das der User selbst entscheiden kann welche Taste er wofür belegt da nicht jeder das gleiche Setup hat und manche Tasten ggf. schon von einer anderen Anwendung in Benutzung sind. Mit dieser Vorgehensweise will ich das bewerkstelligen das der User selbst entscheiden kann welche Taste er belegt um einen Screenshot zu machen.

    Bsp:
    1. User Drückt auf Record Hotkey ...
    2. User Drückt Taste F12
    3. Programm erkennt F12 als Hotkey für Funktion Screenshot und hinterlegt diese in den Einstellungen
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    @C.O.D.E Das ist zwar verständlich, aber nicht sinnvoll.
    Wenn andere Programme Hotkeys registrieren, kann es zu Doppel-Auslösung kommen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!