VB.net Tastaturcode erstellen

  • VB.NET

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

    VB.net Tastaturcode erstellen

    Hallo,

    ich würde gerne einen Tastencode erstellen. Ich habe vieles zum Thema Tastenkombination gefunden. Jedoch nicht wie ich z.B. einen Konamicode erstelle.
    Ich möchte z.B. den Tastencode "Pfeil-oben, Pfeil-oben, Pfeil-unten, Pfeil-unten, Pfeil-links, Pfeil-rechts, Pfeil-links, Pfeil-rechts, Taste-a und Taste-b nacheinander drücken.

    Dazu habe ich leider nichts gefunden.

    Hat jemand eine Idee?

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Da du in Multimedia und Spiele geantwortet hast, wäre es noch gut zu wissen, ob mit einer Engine wie Unity arbeitest, oder einfach mit WinForms oder so.

    Ganz allgemein wäre das meine Idee dazu:
    Als erstes speicherst du dir irgendwo im Code deinen Konami-Code, Bspw. als Liste (Konami-Liste). Danach brauchst du eine zweite Liste für die Eingaben (Input-Liste). Nun zur Prüfung. Gehen wir davon aus der User betätigt nun zum ersten mal eine Taste. Du prüfst nun ob diese Taste der ersten Stelle in deiner Konami-Liste entspricht. Wenn ja, speicherst du die Eingabe in der Input-Liste ab. Bei der nächsten Eingabe prüfst du nun gegen die nächste Stelle in der Konami-Liste. Sollte nun eine andere Eingabe auftauchen als erwartet, leerst du die Input-Liste wieder und fängst von vorne an.
    Gibt der User nach und nach die Richtige Kombi ein, und die Input-Liste hat dieselbe Länge wie die Konami-Liste, dann führst du deine Aktion aus, und leerst die Input-Liste wieder.
    @uNbRaKe: Geht es hier vielleicht um Eingabesimulation bei einer externen Anwendung, also dass Du auf Knopfdruck eine komplexe Eingabe (z.B. eben den Konamicode) simulierst und diese an eine andere App schickst, z.B. einen Konsolenemulator?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für die Antwort.

    Ich würde das erst einmal mit WinForms lösen.
    Das mit der Liste ist eine gute Idee.
    Wie erstelle ich so eine Liste denn am besten?


    @VaporiZed ich stelle mir das so vor, dass während der Eingabe des Code bzw des Tastencodes bei einer geöffneten WinForm eine Funktion aausgeführt wird.

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

    uNbRaKe schrieb:

    dass während der Eingabe des Code bzw des Tastencodes [...] eine Funktion aausgeführt wird.
    Eh. Ja, damit sind wir keinen Schritt weiter. Was will uns der Anwender damit sagen? Willst Du jetzt die Tasten ^, ^, v, v, <, >, <, >, a, b eingeben oder soll das automatisch geschehen? Und wenn ... ach Moment. Du willst quasi einen Cheatcode ähnlich wie den KonamiCode basteln. Das heißt, in Deiner App soll man Funktionen freischalten können, wenn jemand die richtige Reihenfolge eingibt, richtig?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann aktiviere im Form_Load-EventHandler erstmal das Erfassen der Tastendrücke mit KeyPreview = True
    Dann brauchst Du 2 List(Of Keys)-Listen. Die erste, in der Du Deine gewünschte Tastenreihenfolge festhältst. Die zweite, in der später die tatsächlichen Eingaben erfolgen.
    Dann nimmst Du den Form_KeyDown-EventHandler her und packst dort den e.KeyCode ans Ende der 2. Liste. Und gleich danach vergleichst Du Liste 1 mit dem Inhalt von Liste 2. Wenn Die Reihenfolge von Liste 1 in Liste 2 auftaucht, dann mach Deine Aktion. Ein sinnvolles Löschen/Bereinigen von Liste 2 wäre ggf. sinnvoll.

    ... was vom Grundablauf auch schon in Post#2 stand, seh ich gerade :S
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Der zweite heute schon :/

    VB.NET-Quellcode

    1. DeineListOfKeys = New List(Of Keys)


    uNbRaKe schrieb:

    wie befülle ich diese mit der Tastenreihenfolge

    VaporiZed schrieb:

    Dann nimmst Du den Form_KeyDown-EventHandler her und packst dort den e.KeyCode ans Ende der 2. Liste.

    VB.NET-Quellcode

    1. Private Sub Form_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. ListeDerTatsächlichenTastaturdrucke.Add(e.KeyCode)
    3. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Die Liste habe ich nun erstellt.

    VB.NET-Quellcode

    1. Dim KonamiCode As List(Of Keys)


    Befülle ich diese liste dann so:

    VB.NET-Quellcode

    1. KonamiCode.Add(Keys.Up)
    2. KonamiCode.Add(Keys.Up)
    3. KonamiCode.Add(Keys.Down)
    4. KonamiCode.Add(Keys.Down)
    5. KonamiCode.Add(Keys.Left)
    6. KonamiCode.Add(Keys.Right)
    7. KonamiCode.Add(Keys.Left)
    8. KonamiCode.Add(Keys.Right)
    9. KonamiCode.Add(Keys.B)
    10. KonamiCode.Add(Keys.A)

    ?

    Edit:

    VB.NET-Quellcode

    1. Dim KonamiCode As New List(Of Keys) From {Keys.Up, Keys.Up, Keys.Down}

    müsste so doch einfacher gehen.

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

    Pädagogische Antwort: probier es aus und schau doch einfach, wie weit Du kommst.


    ##########

    Klar kannst Du das auch so machen. Aber der endgültige Inhalt passt ja auf jeden Fall. Und darauf kommt es (vor allem) an.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Ich habe beide Listen erstellt. Die erste Liste ist befüllt. Die zweite Liste versuche ich mit

    VB.NET-Quellcode

    1. ​Private Sub Form_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. ListeDerTatsächlichenTastaturdrucke.Add(e.KeyCode)
    3. End Sub

    zu befüllen, jedoch erscheint dann eine Fehermeldung wenn ich eine Taste drücke, welche folgendes besagt:"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    "eingegebenerCode" war "Nothing".

    Das bedeutet, dass die liste nicht befüllt wird oder?
    Hast Du zuvor klassenweit ListeDerTatsächlichenTastaturdrucke mit Dim ListeDerTatsächlichenTastaturdrucke As New List(Of Keys) angelegt? btw: in Post10 hast Du im ersten Codeblock das New vergessen.
    Was ist eingegebenerCode? Das hast Du nirgends beschrieben. Ist das Deine Liste, die ich mit ListeDerTatsächlichenTastaturdrucke beschrieben habe? Hast Du da ggf. auch das New vergessen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    uNbRaKe schrieb:

    Wie man zwei listen miteinander vergleicht ist mir auch klar.
    Das wag ich jetzt zu bezweifeln, sonst würdest Du die Frage nicht stellen. Klingt fies, ist aber inhaltlich vermutlich richtig. Wie würdest Du denn den Vergleich machen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. For Each eingegebenerCode As Keys In KonamiCode
    2. Next


    so würde ich vergleichen, um zu überprüfen welche Elemente in List1(eingegebenerCode) auch in List2(KonamiCode) sind.

    Habe noch folgendes beim googlen gefunden:

    VB.NET-Quellcode

    1. ​If Enumerable.SequenceEqual(KonamiCode, eingegebenerCode) Then
    2. MsgBox("übereinstimmung")
    3. End If


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

    Schau mal nochmal in Post#2. Du musst erst nach dem ersten KonamiCode-Zeichen in der Liste eingegebenerCode suchen. Und dann musst Du schauen, ob die Reihenfolge der darauffolgenden KeyCodes mit der in der KonamiCode-Liste übereinstimmt. Da ist eine normale For-Schleife geeignet. For-Each hingegen nicht. Probier das erstmal. Mit LINQ geht's bestimmt noch effizienter, aber da ich gerade etwas in Zeitnot mit meinen Projekten bin, lass ich Dich erstmal machen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. Private Sub Startmaske_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. eingegebenerCode.Add(e.KeyCode)
    3. For i As Integer = 0 To KonamiCode.Count - 1
    4. If KonamiCode.Item(i) = eingegebenerCode Then
    5. End If
    6. Next
    7. End Sub​


    so werden doch alle Einträge in List1(KonamiCode) druchgegangen und überprüft ob List2(eingegebenerCode) der List1 entspricht.
    Jedoch darf ich das "=" nicht verwenden, da es sich Keys handelt.
    KonamiCode.Item(i) ist vom Typ Keys, eingegebenerCode ist eine List(Of Keys). Daher kann das nicht verglichen werden.
    btw. Statt KonamiCode.Item(i) kannst Du auch kurz schreiben KonamiCode(i)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. ​Private Sub Startmaske_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. eingegebenerCode.Add(e.KeyCode)
    3. For i As Integer = 0 To KonamiCode.Count - 1
    4. If KonamiCode(i) = eingegebenerCode(i) Then
    5. End If
    6. Next
    7. End Sub


    so ist der Index außerhalb des Bereichs.