Hotkey für Button

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Piket95.

    Hotkey für Button

    Hallo

    ich wollte mal fragen wie es möglich ist (ohne ALT) durch druck einer Taste (z. B. F9 oder so) ein Button gedrückt wird?
    Drückt man in diesem Beispiel jetzt F9, dann soll das Programm es so ablaufen lassen als ob eine User den Button gedrückt hat und ein Event auslösen. Also "Button_Click"

    Nur so als kleine Nebeninfo: Ich habe Gegoogelt ich habe hier sie Suche benutzt aber nichts konnte mir so wirklich helfen. Ich habs mir durchgelesen, aber es nicht verstanden.

    Ich hoffe ihr könnt mir helfen.

    LG
    Piket95
    Dann machst Du Dir halt einen Hotkey und rufst dabei auf:

    VB.NET-Quellcode

    1. Button1.PerformClick()
    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!
    An der Stelle, an der Du den Hotkey empfängst, siehe Link von @Monte:, schreibst Du Button1.PerformClick() rein.
    Fertich.
    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 habs jetzt aber so gemacht:

    [VB 2010] Hotkey setzten (Beitrag von K_K)

    Dann kommt aber bei mir folgender Fehler wenn ich das Programm im Nachhinein ausführe:

    "Ein Aufruf an die PInvoke-Funktion "Lets Play Minecraft Timer!Lets_Play_Minecraft_Timer.frmMCTimer::GetAsyncKeyState" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen."
    Dann poste doch bitte mal den relevanten Code, damit wir den Fehler nachvollziehen können.
    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!
    Quelle: Beitrag "Hotkey setzen" (Link siehe oben)

    K_K schrieb:


    Es geht doch viel einfacher (zwar nicht die sicherste möglichkeit und ich weis nicht ob sie auf allen systemen leuft)

    VB.NET-Quellcode

    1. Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Int32) As Short


    kommt nach ganz oben unter

    VB.NET-Quellcode

    1. Public Class Form1


    dann in ein Timer event:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Dim hotkey1 As Boolean ' <-- hier erstmal den hotkey definieren
    3. hotkey1 = GetAsyncKeyState(Keys.F1) ' <-- dann sagen, wann er ausgelöst werden soll (in den falle F1)
    4. If hotkey1 = True Then ' < -- wenn er dann ausgelöst wird
    5. My.Computer.Keyboard.SendKeys("z.B.") ' <-- z.B. eine sache die passieren soll, wenn der hotkey aktiviert werden soll
    6. End If ' <-- das erklährt sich von selbst
    7. End Sub


    und fertig ist man ;)


    ^
    |
    So hab ich das übernommen und ausprobiert und danach kam eben diese Fehlermeldung.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Piket95“ ()

    Zurück zu Feld Nr. 1. :S
    Sieh Dir mal den Link von @Monte: an. So wird ein Schuh draus.
    Nie und nimmer nicht ein Timer :!:
    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!
    Dann beschäftige Dich vielleicht mit diesen Funktionen:

    VB.NET-Quellcode

    1. Private Declare Function RegisterHotKey Lib "user32" ( _
    2. ByVal Hwnd As IntPtr, ByVal ID As Integer, _
    3. ByVal Modifiers As Integer, ByVal Key As Integer) As Integer
    4. Private Declare Function UnregisterHotKey Lib "user32" ( _
    5. ByVal Hwnd As IntPtr, ByVal ID As Integer) As Integer
    Du registrierst eine (oder mehrere) Tasten(-kombinationen) beim System, und immer wenn eine dieser Tasten(-kombinationen) gedrückt wird wirst Du vom System darüber informiert.
    Dazu muss die Funktion WndProc überladen weerden, damit die Nachricht des Systems bei Dir ankommt. Diese kannst Du dann verteilen.
    Und wenn das Programm beendet wird, wird aufgeräumt und dem System mitgeteilt, dass diese Tasten nun nicht länger HotKeys sind.
    Das wars. :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!
    Aber das kapiere ich nicht ich mach kein Copy-Paste. Ich würde schon gerne kapieren was ich in meinen Code reinschreibe.
    ich zB. glaube fest daran, dass, wenn man etwas nicht kapiert, dass man dann danach fragen kann.
    Möglich - sogar wahrscheinlich, dass man mehrere Anläufe unternehmen muß, bis man die richtige Frage in der richtigen Präzision auf dem richtigen Level an Vorwissen gefunden hat, aber es ist möglich.

    Wer nicht fragt, bleibt dumm
    Der Fehler in meinen Source ist, dass dort nicht mehr die aktuelle API ist.
    Um den Fehler zu behen musst du einfach

    VB.NET-Quellcode

    1. Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Int32) As Short

    mit

    VB.NET-Quellcode

    1. <DllImport("user32.dll")> _
    2. Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
    3. End Function

    Austauschen ;)

    @ErfinderDesRades
    So Fragwürdig ist der Post garnich. So funktioniert es ja auch. :)
    Ja, ich weiß, das es eine Blöde Art ist es zu lösen, aber wenn es um einfache und unkomplexe Programme geht, kann man es verwenden, wenn es schnell gehen soll :)

    K_K schrieb:

    dass dort nicht mehr die aktuelle API ist.
    Das macht es nicht, für die API ist das identisch, denn die API weiß nichts von System.Windows.Forms.Keys.
    @Piket95: Das Problem besteht darin, und da bitte ich Dich, Dich mal dazu zu äußern, ob das ganze funktionieren soll, auch wenn Du nebenbei in WinWord einen Brief schreibst, oder nur, wenn Du in Deinem Programm bist (welches Programm hat den Fokus / kann den Fokus haben).
    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!
    Vor lauter hin und her, weiß ich gar nicht mehr wo hinten und vorne ist. Gibt es denn dafür keinen leichten Code, der auch gleichzeitig noch leicht zu erklären ist? Das wäre ganz hilfreich für mich, weil ich mit Hotkeys noch nie in meinem Leben was gemacht hab.

    @RodFromGermany Der Hotkey soll auch dann funktionieren, wenn mein Programm den Fokus nicht besitzt.

    LG
    Piket95

    RodFromGermany schrieb:

    Dann beschäftige Dich vielleicht mit diesen Funktionen:
    Dachte ich mir.
    Probier mal dies aus:
    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 WM_HOTKEY As Integer = &H312
    5. Private Const MOD_NONE As Integer = &H0
    6. Private Const MOD_ALT As Integer = &H1
    7. Private Const MOD_CONTROL As Integer = &H2
    8. Private Const MOD_SHIFT As Integer = &H4
    9. Private Const MOD_WIN As Integer = &H8
    10. Protected Overrides Sub WndProc(ByRef m As Message)
    11. 'die messages auswerten
    12. If m.Msg = WM_HOTKEY Then
    13. 'hier wird entschieden welcher hotkey es war
    14. 'einfach die übergebene id auswerten
    15. Select Case m.WParam
    16. Case 1
    17. MessageBox.Show("Sie haben die Tab-Taste gedrückt!")
    18. Case 2
    19. MessageBox.Show("Sie haben die 1 gedrückt!")
    20. Case 3
    21. MessageBox.Show("Sie haben Ctrl 1 gedrückt!")
    22. End Select
    23. End If
    24. MyBase.WndProc(m)
    25. End Sub
    26. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    27. 'die tab taste wieder freigeben
    28. UnregisterHotKey(Me.Handle, 1)
    29. UnregisterHotKey(Me.Handle, 2)
    30. UnregisterHotKey(Me.Handle, 3)
    31. End Sub
    32. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    33. 'die tab taste abfangen
    34. RegisterHotKey(Me.Handle, 1, MOD_NONE, Keys.Tab)
    35. RegisterHotKey(Me.Handle, 2, MOD_NONE, Keys.D1)
    36. RegisterHotKey(Me.Handle, 3, MOD_CONTROL, Keys.D1)
    37. End Sub
    38. 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!
    Danke für den Code, nur könnte mir den auch jemand erklären, denn ich verstehe z. B. diesen Teil nich:

    VB.NET-Quellcode

    1. Select Case m.WParam
    2. Case 1
    3. MessageBox.Show("Sie haben die Tab-Taste gedrückt!")
    4. Case 2
    5. MessageBox.Show("Sie haben die 1 gedrückt!")
    6. Case 3
    7. MessageBox.Show("Sie haben Ctrl 1 gedrückt!")
    8. End Select


    LG
    Piket95
    Es werden 3 Tasten (-Kombinationen) registriert und fortlaufend numeriert.
    Die WndProc ist dabei so freundlich Dich darauf hinzuweisen, dass im Betrieb eine dieser Tasten (-Kombinationen) gedrückt wurde, was mit einer MessageBox angezeigt wird.
    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!