im Timer auf Form1_KeyDown () zugreifen

  • VB.NET

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

    im Timer auf Form1_KeyDown () zugreifen

    Hi,
    ich würde gerne Form1_KeyDown innerhalb meines Timers aufrufen (es soll in der Private Sub Timer1_Tick überprüft werden, ob eine Taste gedrückt wurde. Wenn das der Fall ist, das sollen ein paar Aktionen ausgeführt werden.

    Nun muss ich das sicher wie folgt aufrufen: Form1_KeyDown () -> nur was kommt in die Klammern damit es läuft??? Habe schon seit Stunden herumgesucht, aber noch keine Antwort gefunden. Bin für alles dankbar. Die Private Sub für Form1_KeyDown ist unten angegeben und funktioniert soweit, ich kann sie nur nicht im Timer aufrufen, da ich noch nicht verstanden habe, was ich für System.Object alles eingeben kann/muss.




    PrivateSub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) HandlesMyBase.KeyDown, MyBase.KeyUp

    Label1.Text =
    "neu"
    If e.KeyCode = Keys.Left Then ball.Left -= 15If ball.Left <= 0 Then ball.Left += 15
    EndSub


    Danke im voraus. :)
    P.S. Habe VB 2010
    KeyDown wird immer aufgerufen wenn eine Taste gedrückt wird und die Form den Focus hat. Der Timer ist also unnötig.

    Es gibt übrigens einen sehr nützlichen VB-Tag im Editor da wird der Code gut formatiert und Syntaxhighlightning hinzugefügt, dann musst du es nicht selber machen und es ist leserlicher ^^
    Hi
    das wäre eher unnötig. Setze einfach Flags in einem Enum, die die gedrückten Tasten behalten:

    VB.NET-Quellcode

    1. Public Enum KeyFlags
    2. None = 0
    3. Left = 1
    4. Top = 2
    5. Right = 4
    6. Down = 8
    7. End Enum

    und dann halt per (Flags And KeyFlags.Left) = KeyFlags.Left abfragen. Im Timer kann man dann die Neupositionierung, etc. durchführen.

    Gruß
    ~blaze~
    Vielen Dank erstmal, da werd ich mich die nächsten Tage noch weiter einlesen müssen in eure Tipps. ;)

    Dachte es geht einfacher. In anderen Programmiersprachen kann ich ja auch in etwa schreiben "wenn Taste gedrückt, dann mach das). Find ich hier etwas umständlich, wenn man in einer Subroutine nicht einfach auf diese Befehle zugreifen kann... 8|
    Mit GetAsyncKeyState geht das und in My gibt's auch ein Keyboard, das du direkt ansprechen kannst (gibt's wahrscheinlich auch irgendwo eine Klasse zu).
    Das macht man aber eigentlich eher nicht, da es einfacher ist, direkt die KeyFlags zu verarbeiten.
    Btw. oben habe ich etwas vergessen: Du musst un KeyDown die flags dann entsprechend per Or setzen:

    VB.NET-Quellcode

    1. Private _movement As MovementFlags
    2. Sub Form_KeyDown(ByVal sender As Object, Byval e As KeyEventArgs) Handles Me.KeyDown
    3. If e.KeyData = Keys.W Then
    4. _movement = _movement Or MovementFlags.Up
    5. ElseIf e.KeyData = Keys.S Then
    6. _movement = _movement And Not MovementFlags.Down
    7. '...
    8. End If
    9. _movementTimer.Enabled = _movement <> MovementFlags.None
    10. End Sub
    11. Sub Form_KeyUp(ByVal sender As Object, Byval e As KeyEventArgs) Handles Me.KeyUp
    12. If e.KeyData = Keys.W Then
    13. _movement = _movement And Not MovementFlags.Up
    14. ElseIf e.KeyData = Keys.S Then
    15. _movement = _movement And Not MovementFlags.Down
    16. '...
    17. End If
    18. _movementTimer.Enabled = _movement <> MovementFlags.None
    19. End Sub

    VB.NET-Quellcode

    1. Public Enum MovementFlags
    2. None = 0
    3. Left = 1
    4. Up = 2
    5. Right = 4
    6. Down = 8
    7. End Enum


    Gruß
    ~blaze~
    Hier noch das Ganze mit GetAsyncKeyState:

    VB.NET-Quellcode

    1. Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    2. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    3. If GetAsyncKeyState(Keys.W) Then 'W gedrückt
    4. 'Code
    5. End If
    6. End Sub

    peter85 schrieb:

    Dachte es geht einfacher. In anderen Programmiersprachen kann ich ja auch in etwa schreiben "wenn Taste gedrückt, dann mach das"
    Ich weiß nicht, was du hast. Das ist doch genau, was ~blaze~ dir in seim Sample zeigt.
    Schreib hin

    VB.NET-Quellcode

    1. Sub Form_KeyDown(ByVal sender As Object, Byval e As KeyEventArgs) Handles Me.KeyDown
    2. 'hier was zu tun ist
    3. End Sub
    und alles innerhalb der Methode bedeuted "... dann mach das"

    Find ich hier etwas umständlich, wenn man in einer Subroutine nicht einfach auf diese Befehle zugreifen kann.
    Auf welchen Befehl kannst du nicht zugreifen??