| |
VB.NET - Ein- und UmsteigerKeyDown Event für Pfeiltasten | For Schleife aktualisieren | | | Autor: IIINikeIII | Datum: 12.04.13 21:31 |
| VS-Studio 2008 Express
Windows 7
Guten Abend, ich bräuchte mal eure Hilfe:
Und zwar soll mein Programm einen bestimmten Code ausführen solange eine Taste gedrückt ist.
Mit den Events KeyDown und KeyUp grundsätlich kein Problem. Allerdings lösen die Pfeiltasten weder KeyDown, noch KeyUp, noch KeyPress aus. Ich hab im Internet nach einer Lösung gesucht und bin auf folgenden Code gestoßen:
Protected Overrides Function ProcessCmdKey(ByRef msg As _
System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As _
Boolean
If keyData = Keys.Space Then
'Code
End If
If keyData = Keys.Down Then
'Code
End If
End Function Das funktioniert als Ersatz für das KeyDown Event. Jetzt brauchte ich noch eine Funktion für das loslassen. Gefunden:
Private Const WM_KEYUP As Integer = &H101
Protected Overrides Function ProcessKeyPreview(ByRef m As Message) As Boolean
Select Case m.Msg
Case WM_KEYUP
If WantKeyEvent(m, True) Then
Return True
End If
End Select
Return MyBase.ProcessKeyPreview(m)
End Function
Private Function WantKeyEvent(ByRef m As Message, ByVal up As Boolean) As _
Boolean
Dim keyy As Keys = CType(m.WParam.ToInt32, Keys)
Select Case keyy
Case Keys.Space
'Code
Return True
Case Keys.Down
'Code
Return True
Case Else
Return False
End Select
End Function Diese Funktion hat allerdings den Nachteil, dass man zuerst eine der Pfeiltasten drücken muss, damit der Code auch für die anderen Tasten funktioniert. Aber das ist nicht das eigentliche Problem. An sich funktioniert alles problemlos, auch wenn man mehrere Tasten gleichzeitig gedrückt hält. Z.b. (Pfeiltaste + anderePfeiltaste + Leertaste). Das geht mit allen Kombinationen, außer (PfeiltasteLinks + PfeiltasteOben + Leertaste). Ich war überrascht und habe nach Fehlern im Code gesucht. Ergebnislos. Dann habe ich die Laptoptastatur benutzt (ich verwende sonst eine externe) und war sehr erstaunt, dass es mit dieser funktioniert hat. Sogar wenn ich nur eine (egal welche der drei) auf der Laptoptastatur drücke und die anderen beiden auf der externen geht es. Es liegt jedenfalls nicht daran, dass meine Tastatur das gleichzeitige Gedrückthalten von drei Tasten nicht handeln könnte oder so; mit z.B. (PfeiltasteOben + PfeiltasteRechts + Leertaste) oder (PfeiltasteLinks + PfeiltasteUnten + Leertaste) geht es schließlich auch.
Es wäre daher besser, wenn ich einen anderen Weg, statt der zwei obigen Funktionen wählen könnte. Nur leider bin ich auf dem Gebiet kein Experte. Kennt jemand von euch vielleicht eine bessere Lösung für mein Problem?
Und noch ein andere Frage:
Ich habe eine System.Collections.Arraylist, und möchte alle Elemente auf einen gewissen Umstand überprüfen, und gegebenenfalls entfernen. Da Elemente entfernt werden, kommt eine For Each Schleife nicht infrage. Mit einer normalen For Schleife ergibt sich allerdings auch ein Problem.
Vereinfachtes Beispiel:
Dim A As New System.Collections.ArrayList
A.Add(0)
A.Add(1)
For i As Integer = 0 To A.Count - 1
If A.Count = 2 Then
A.RemoveAt(i)'Da das aktuelle Element gelöscht wurde, muss ich zum
i -= 1 'Anfang der Schleife zurückkehren um das Element zu
Continue For 'überprüfen, das nachgerückt ist
End If
Next Da der Endwert einer For Schleife nur beim ersten Mal abgerufen wird, ich diesen durch das Entfernen eines Elementes allerdings verändert habe, zählt die Schleife soweit, als ob ich kein Element entfernt hätte. Im Rahmen der Überprüfung wird dann natürlich eine ArgumentOutOfRangeException ausgelöst. Ich habe das Problem mit einer Abbruchbedingung gelöst:
If i > A.Count - 1 Then Exit For Mich würde allerdings interessieren, ob es nicht auch eine Möglichkeit gibt den Endwert zu aktualisieren.
Danke im Vorraus für das Lesen des langen Posts
IIINikeIII
_________________________________________________
VB.Net Einsteiger mit fortgeschrittenem Unwissen. | |
Re: KeyDown Event für Pfeiltasten | For Schleife aktualisieren | | | Autor: Manfred X | Datum: 13.04.13 18:05 |
| Hallo!
Das geschilderte Key-Problem verstehe ich nicht.
Gewisse Effekte scheinen mit den installierten Tastaturtreibern
zusammenzuhängen.
Wieso sollen Verarbeitungen erfolgen, falls mehrere (Pfeil-) Tasten
gleichzeitig gedrückt werden? Vorgesehen ist das nicht!
Die Betätigung von Pfeiltasten wird "normal" in den entsprechenden
Events gemeldet (Keys.Left, Keys.Right, Keys.Up, Keys.Down).
Das Entfernen von Elementen aus einer Liste wird durch eine
rückwärtslaufende Schleife "Count-1 To 0 Step -1" realisiert.
Tricksereien sind nicht erforderlich, weil der Endpunkt der
Schleife 0 und die restlichen Indices keinen Änderungen wegen
des Löschens von Elementen unterliegen.
Man benutzt heutzutage gewöhnlich eine generische List(of ....).
Beitrag wurde zuletzt am 13.04.13 um 18:10:08 editiert. | |
Re: KeyDown Event für Pfeiltasten | For Schleife aktualisieren | | | Autor: IIINikeIII | Datum: 13.04.13 19:01 |
| Das die Funktion, für jeden Tastendruck einzeln aufgerufen wird ist mir schon klar. Ich meinte, dass mehrere Tasten gleichzeitig gedrückt bleiben.
Z.B. Soll sich ein Objekt nach links bewegen, wenn man links drückt und zusätzlich nach oben, wenn man PfeiltasteOben drückt. Und wenn man die Leertaste drückt, soll noch irgentwas passieren. Eben solange, bis die Taste wieder losgelassen wird.
Ich erwarte mir auch nicht, dass irgendjemand den "Fehler" findet. Mich hätte nur interessiert, was die beste/eleganteste Lösung für mein Problem (Es sollte auch für Pfeiltasten funktionieren und ich sollte auf das gedrückt weren und loslassen einer Taste reagieren können) ist.
Danke für den Tipp.
Das erspart mir dann einige CType-Funktionen, um auf die Eigenschaften des Listenelements zugreifen zu können.
_________________________________________________
VB.Net Einsteiger mit fortgeschrittenem Unwissen. | |
Re: KeyDown Event für Pfeiltasten | For Schleife aktualisieren | | | Autor: FZelle (Moderator) | Datum: 14.04.13 12:15 |
| Die beste Lösung ist einen vernünftigen Ansatz für eine Aufgabenstellung zu benutzen.
Du willst die Tastaturfunktionen für Officeanwendungen für Spiele "missbrauchen", das kann nicht funktionieren.
Benutze etwas wie DirectInput dann hast du das Problem nicht. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevCommand 4.0
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere Infos
|