Hotkeys erstellen, dir nur einmal senden

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Neon.

    Hotkeys erstellen, dir nur einmal senden

    Hallo,
    Ich möchte einen Keybinder erstellen und benötige hierfür Hotkeys.
    Nun habe ich das Problem, wenn ich den Hotkey gedrückt halte, fängt mein keybinder an zu spammen, das darf er aber nicht. ich möchte, dass wenn die Taste gedrückt wird, er nur einmal die Keybinds abschikkt egal wie lange man den Hotkey gedrückt hält.


    so hier nach anweisung von @RodFromGermany:
    mein ausgedünnter script:

    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. Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
    7. If CheckBox1.Checked = True Then
    8. RegisterHotKey(Me.Handle, 1, Key_NONE, Keys.D1)
    9. Else
    10. UnregisterHotKey(Me.Handle, 1)
    11. End If
    12. End Sub
    13. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    14. End Sub
    15. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    16. MyBase.WndProc(m)
    17. If m.Msg = WM_HOTKEY Then
    18. Select Case m.WParam
    19. Case 1
    20. SendKeys.Send("t/carkey{ENTER}")
    21. End Select
    22. End If
    23. End Sub
    24. End Class


    Ich hoffe so ist es einfacher mir einen lösungsvorschlag zu machen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Zohan97“ ()

    @Zohan97: Kannst Du bitte mal Deinen Code so ausdünnen, dass nur noch Code übrig bleibt, der Deinen Effekt beschreibt?
    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!
    Zohan97 hat in der Zwischenzeit seinen Eröffnungspost editiert, deswegen erstelle ich einen neuen Post und bearbeite meinen letzten nicht.
    ----------------------------------
    @Zohan97: Der Code, den Du übrig gelassen hast, erzeugt nun allerdings andere Fehler. :S
    Mach es bitte so, dass Dein Code wenigstens richtig compiliert.
    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!

    RodFromGermany schrieb:

    Zohan97 hat in der Zwischenzeit seinen Eröffnungspost editiert, deswegen erstelle ich einen neuen Post und bearbeite meinen letzten nicht.
    ----------------------------------
    @Zohan97: Der Code, den Du übrig gelassen hast, erzeugt nun allerdings andere Fehler. :S
    Mach es bitte so, dass Dein Code wenigstens richtig compiliert.



    8| das ist jetzt schon wieder ne nummer zu hoch für mich :D
    was für fehler erzeugt er ? eig. habe ich alles dringelassen, was releveant zu meinem Problem ist
    Dein Code hört mitten in der Prozedur

    VB.NET-Quellcode

    1. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    auf. :D
    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!
    Probier es mal so, da ist es etwas freundlicher:
    Spoiler anzeigen

    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. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. RegisterHotKey(Me.Handle, 1, Key_NONE, Keys.D1)
    8. End Sub
    9. Private Sub Form1_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    10. UnregisterHotKey(Me.Handle, 1)
    11. End Sub
    12. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    13. If m.Msg = WM_HOTKEY Then
    14. Select Case m.WParam
    15. Case New IntPtr(1)
    16. If CheckBox1.Checked Then
    17. SendKeys.Send("t/carkey{ENTER}")
    18. End If
    19. m.WParam = IntPtr.Zero
    20. End Select
    21. End If
    22. MyBase.WndProc(m)
    23. End Sub
    24. End Class
    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!
    tja, das habe ich jetzt mal so ausprobiert und muss sagen, ich merke als leie keinen Unterschied :D

    also spammen tut er immer noch... hat keiner ne Idee was man da machen kann ?

    /e.
    @Neon: du hast doch auch einen UKeybinder gemacht wenn ich mich richtig erinnere ... Wie hast du denn das da gemacht ?
    Das mit den Tastendrücken ist ja wie bei einem normalen Editor. Die Taste kommt und nach einer Weile schlägt AutoRepeat zu.
    Wahrscheinlich hast Du bei Dir eine sehr kurze Zeitspanne bis zum Autorepeat eingestellt.
    Möglicherweise musst Du dann in der WndProc() mit GetAsyncKeyState() das Loslassen der Taste abfragen.
    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!
    okay... und wie genau funktioniert dies ? ich habe leider keine Lernbücher für vb und erlerne mehr oder weniger durch foren einträge und Youtube videos...
    Doch irgentwie finde ich immer nur tuts für einen Keylogger, was ich bei weitem nicht programmieren möchte...
    Such mal hier im Forum nach der API-Funktion GetAsyncKeyState() und versuch dann zu ergründen, was sie macht.
    Dann sehen wir weiter. :thumbsup:
    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!
    Für Dein Problem brauchst Du die GetAsyncKeyState()-Funktion. Mit ihr kannst Du feststellen,
    1. dass Dein HotKey betätigt wurde
    2. dass Dein HotKey wieder losgelassen wurde.
    Das solltest Du rauskriegen.
    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!