Tastenabfrage funktioniert nicht!

  • VB.NET

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

    Tastenabfrage funktioniert nicht!

    Hallo!

    Ich wollte in meinem Programm eine PicBox mit den Pfeiltasten bewegen. Aber es tut sich nichts. Im TryCatch Block wird nichts gesagt und im Compiler auch nicht. Ich habe es auch schon mit e.KeyCode probiert.

    VB.NET-Quellcode

    1. Try
    2. If GetAsyncKeyState(Keys.Right) = True Then
    3. 'If kollision(New Rectangle(player.Location.X + 5, player.Location.Y, player.Size.Width, player.Size.Height)) = False Then
    4. MsgBox("hi")
    5. player.Location = New Point(player.Location.X + 5, player.Location.Y)
    6. Me.Refresh()
    7. 'End If
    8. ElseIf GetAsyncKeyState(Keys.Left) = True Then
    9. 'If kollision(New Rectangle(player.Location.X - 5, player.Location.Y, player.Size.Width, player.Size.Height)) = False Then
    10. player.Location = New Point(player.Location.X - 5, player.Location.Y)
    11. 'Me.Refresh()
    12. 'End If
    13. ElseIf e.KeyCode = Keys.Up Then
    14. 'If kollision(New Rectangle(player.Location.X, player.Location.Y - 5, player.Size.Width, player.Size.Height)) = False Then
    15. player.Location = New Point(player.Location.X, player.Location.Y - 5)
    16. 'Me.Refresh()
    17. 'End If
    18. ElseIf e.KeyCode = Keys.Down Then
    19. 'If kollision(New Rectangle(player.Location.X, player.Location.Y + 5, player.Size.Width, player.Size.Height)) = False Then
    20. player.Location = New Point(player.Location.X, player.Location.Y + 5)
    21. 'Me.Refresh()
    22. 'End If
    23. End If
    24. Catch ex As Exception
    25. MsgBox(ex.ToString)
    26. End Try
    Whos Faster ALPHA: Bald....
    Setz mal Haltepunkte an den Stellen, an denen der Player seine Position verändert.
    Werden die überhaupt durchlaufen?
    Bzw. wird der ganze Code durchlaufen?
    @joscha999:

    Digot - Software schrieb:

    Ich habe es auch schon mit e.KeyCode probiert.
    Hat er doch schon im 1. Post geschrieben...

    @Digot - Software:
    Du könntest es natürlich auch mit RegisterHotKey machen (siehe hier), Problem daran wäre aber, dass es immer registriert wird, egal ob deine Anwendung gerade im Vordergrund ist oder nicht.
    Hast du mal einen Haltepunkt oder eine MessageBox vor/hinter die Prozedur gesetzt? Nur um sicherzustellen, dass der Code durchlaufen wird...
    Zeig mal Deine GetAsyncKey Deklaration ! Normalerweise sollte die ungefähr so aussehen:

    VB.NET-Quellcode

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


    Dann probiers mal mit der Abfrage:

    VB.NET-Quellcode

    1. If (GetAsyncKeyState(Keys.Right) And &HFF) = 1 Then ... ' rechte Pfeiltaste


    Aber warum arbeitest Du mit einem Timer und GetAsyncKeystate wenn Du doch einfach nur das KeyUp oder KeyDown Eriegnis der Form abfragen musst ? Dabei muss natürlich KeyPreview=True sein ....
    So ich hab mal ein MsgBox hingegeben und es kommt bei allen Tasten außer den Pfeiltasten die MsgBox.

    Vielleicht hängt das mit den Buttons in meiner Form zusammen.

    EDIT: @Touche: Das geht auch nicht.
    Whos Faster ALPHA: Bald....
    Nutze das KeyDown-Event, um auf Tastendrücke zu reagieren.
    Nimm das KeyDown-Event der Form und gib dieser KeyPreview = True.
    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!

    Digot - Software schrieb:

    @RodFromGermany: Da ist es und KeyPreview = True

    In welchem Ereignis fragst Du dann bitte ab wenn nicht in einem Timer ?

    Im Keydown Ereignis bekommst Du doch die gedrückte Taste mitgeliefert ????

    VB.NET-Quellcode

    1. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    2. If e.KeyCode = Keys.Right Then ...


    Da ist die API doch vollkommen überflüssig, wie oben schon gesagt ...

    Touche schrieb:

    Da ist die API doch vollkommen überflüssig, wie oben schon gesagt ...

    Genau so ist es. :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!
    Ich glaube es liegt an den Buttons. Weil alle anderen Tasten nimmt er. Weil die Buttons werden so "fokusiert" also sie werden so blau ein bisschen am Rand wenn ich die Pfeiltasten drücke.
    Whos Faster ALPHA: Bald....
    Genau dieas verhindert KeyPreview = True. Nur die Tabulator-Taste spielt da nicht mit, die wird vom System anders priorisiert.
    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!
    Wenn du wie von RodFromGermany gesagt KeyPreview auf True stellst und dann folgenden Code verwendest:

    VB.NET-Quellcode

    1. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    2. MsgBox(e.KeyData.ToString)
    3. End Sub

    Kommt dann bei Pfeil-Tasten ein korrekter Wert oder nicht? Müsste schon - bei mir funzts jedenfalls!
    Nimm da keine MessageBox, pack die Ausgabe in ein Label, dann geht es "Online".
    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:

    Genau dieas verhindert KeyPreview = True. Nur die Tabulator-Taste spielt da nicht mit, die wird vom System anders priorisiert.

    Nee sorry, da hast Du Unrecht und Digot hat Recht: bei mehreren Controls manövrieren die Pfeiltasten genauso wie die Tabulator-Taste.

    Kann man selber ausprobieren: pack mehrere Buttons auf Deine Form und führ folgenden Code aus:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Implements IMessageFilter
    3. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    4. Debug.Print("Key im Keydown Event: {0}", e.KeyCode)
    5. End Sub
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. Application.AddMessageFilter(Me)
    8. Me.KeyPreview = True
    9. End Sub
    10. Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
    11. Const WM_KEYDOWN = &H100
    12. If m.Msg = WM_KEYDOWN Then
    13. Dim key As Keys = CType(CInt(m.WParam), Keys)
    14. Debug.Print("key in MessageFilter: {0}", key)
    15. ' HIER DEINE PRÜFUNG
    16. If key = Keys.Right Then MessageBox.Show("Hurra")
    17. End If
    18. ' done
    19. Return False
    20. End Function
    21. End Class

    Bei Tabulator/Pfeiltasten macht das KeyDown Event garnix, aber die Messagefilter Sub 'schlägt aus', bzw. meldet es im Direktfenster.

    @Digot wenn Du den MessageFilter nimmst brauchst Du noch nicht einmal KeyPreview=True oder GetAsyncKeyState

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Touche“ ()