vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
KeyDown 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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: KeyDown Event für Pfeiltasten | For Schleife aktualisieren 
Autor: ModeratorFZelle (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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel