vb.net Mit einem (Xbox) Controller im Menü navigieren

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von ClonkAndre.

    vb.net Mit einem (Xbox) Controller im Menü navigieren

    Hallo community,

    ich habe mit Hilfe der ControllerDLL meinen Xbox One und 360 Controller zum laufen bekommen.

    Nun möchte ich ein Programm erstellen wie Steam BigPicture also was ich eigentlich nur brauche ist wie man mit dem Controller durch die Menüs navigieren kann.
    Zum Beispiel: Ich drücke auf dem Controller mit dem D-Pad nach links und auf meinem Programm ist dann auch der linke Button ausgewählt.

    Wie geht das?
    Danke im vorraus

    ClonkAndre schrieb:

    und auf meinem Programm ist dann auch der linke Button ausgewählt.
    ? Kapier ich nicht. Liegt wohl daran, dass ich nicht weiß, wie Dein Programm aussieht. Ich bekomm leider das Beispielprogramm nicht zum Laufen. Hatte noch ein Thrustmaster Dual Analog Gamepad rumliegen, aber wenn ich es probiere, komm ich nur in einen unkommentierten Haltemodus. Die DLL scheint wohl Gamepad-eingeschränkt zu sein. Hab leider keinen XBOX-Controller.
    Aber die DLL bietet doch eine Instanzerzeugung an. Über die Variablendeklaration mittels WithEvents kommt man doch ohne AddHandler an die Events wie XBoxController.DPadChanged. Da sollte es doch auch für Dich weitergehen können, oder?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    So müsste man es versehen

    Ja die DLL funktioniert leider nur mit XBOX Controller aber ich poste hier mal ein Bild von Steam BigPicture das müsste man dann verstehen. (erklärungs Bild im Anhang)
    Bilder
    • erklärung.png

      913,61 kB, 1.920×1.085, 33 mal angesehen
    Push :?:
    Nach < 1 Stunde? Hallo?!? 1. Haben wir auch noch was anderes zu tun und 2. frag ich mich, ob Du meine Antwort gelesen hast? Und zwar mit ganzer Konzentration. Die DLL bietet die Möglichkeit per EventRaising auf DPad-Aktionen zu reagieren. Was ist daran nicht gut genug, um es zu nutzen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich weiß das ich das DPad abfragen kann ob es gedrückt wurde aber wie kann ich es so machen das dann auch der nächste Button ausgewählt ist? z.b. wenn ich links drücke dann ist auch der linke Button "anvisiert"

    b.t.w: Sorry für "Push" :p
    Wenn es tatsächlich Dein Programm ist, was Du mit Gamepad und der DLL "manipulieren" willst: Ja, dann sorry, aber wenn Du es nicht weißt, woher sollen wir es denn wissen? Das kommt auf viele Sachen an. Arbeitst Du mit PictureBoxes? Allgemein WPF oder WinForms? Nutzt Du eigene CEs? Wie ist denn Deine Menüführung bisher?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Also ganz einfach: Ich habe 3 Buttons nebeneinander und wie es auch so sein soll wenn ich nach links drücke auf dem DPad dann soll halt der ganz Linke button ausgewählt werden und wenn man A drückt dann soll dann halt der auch gedrückt werden wie PerformClink

    ich benutze WinForms
    Ich versteh das Problem nicht.
    Pseudocode:

    Quellcode

    1. Dim SelectedButton As Button = Nothing
    2. Private Sub DPadAuswertung()
    3. Wenn DPad-links-gedrückt-wurde Dann Button_Links.Select(): SelectedButton = Button_Links
    4. End Sub

    Statt .Select() kannst Du auch .Focus nutzen, wird nur nicht bei IntelliSense angezeigt, da versteckt.
    PerformClick eben mit

    Quellcode

    1. Private Sub XBoxButtonAuswertung()
    2. Wenn A-gedrückt-wurde Dann SelectedButton.PerformClick()
    3. End Sub


    btw: Ich bin kein Fan von PerformClick. Das deutet nämlich darauf hin, dass man n Haufen Code im Button_Click-EventHandler hat. Und dieser Code sollte eigentlich in eine eigene Prozedur mit aussagekräftigen Namen. Diese Prozedur wird dann im Button_Click-EventHandler aufgerufen. Oder eben von woanders aus, wie in Deinem Fall. Aber das ist nur meine persönliche Ansicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed
    Genau das suche ich! Doch was kann ich machen wenn es mehrere Buttons sind und ich kann halt durch alle navigieren? Muss ich dann alle Buttons einzelnd hinschreiben? Da gibt es doch bestimmt eine einfachere Lösung.

    Aber genau das ist was ich suche nur halt wie sieht dann der Code da aus und wie kann ich mehrere Buttons hinzufügen und dann kann der Benutzer durch alle Buttons navigieren?
    Das folgende ist eine Code-Ergänzung, um Dein Ziel zu erreichen.
    Eine Möglichkeit: Du machst Dir eine List(Of Button)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim ButtonList = New List(Of Button)
    3. Dim CurrentButtonIndex = 0

    Dann packst Du zu Programmstart in diese Liste all Deine Buttons in der gewünschten Reihenfolge rein:

    VB.NET-Quellcode

    1. ButtonList.Add(Button1)
    2. ButtonList.Add(Button2)
    3. 'etc.
    Statt Button1 usw. hoffe ich mal, dass Du sinnvollere Namen bereits vergeben hast, bei denen Du dann bereits sehen kannst, was passiert, wenn Du den Button klickst, z.B. BtnStartGame, BtnShowSettings, BtnEnd etc.
    Dann kannst Du mit Deinem DPad hin- und hernavigieren:

    Quellcode

    1. Wenn DPad-Links, dann CurrentButtonIndex -= 1: Wenn CurrentButtonIndex < 0, Dann CurrentButtonIndex = ButtonList.Count - 1
    2. Wenn DPad-Rechts, dann CurrentButtonIndex += 1: Wenn CurrentButtonIndex = ButtonList.Count - 1, Dann CurrentButtonIndex = 0
    3. ButtonList(CurrentButtonIndex).Select

    Ja an die anderen, man kann mit Mod das kürzer machen, aber ich setze mal n bisken tiefer an.
    Und dann eben

    Quellcode

    1. Wenn A-gedrückt, dann ButtonList(CurrentButtonIndex).PerformClick

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich teste es mal aus danke für deinen Code
    und ja: Ich gebe meinen CEs immer andere Namen ;)

    EDIT:
    Stimmt da habe ich auch noch eine Idee gehabt undzwar um nicht alle Buttons mit blabla.add(button1) und weiter einzelnd zu schreiben kann man das ja einfach mit einer for each schleife machen
    da hab ich auch mal nachgedacht :D

    Die Schleife birgt ein Risiko:

    VaporiZed schrieb:

    Dann packst Du zu Programmstart in diese Liste all Deine Buttons in der gewünschten Reihenfolge rein
    Ob bei einer Schleife die von Dir gewünschte Reihenfolge rauskommt, muss Du dann selber ermitteln.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ouuuu das stimmt! Schade ich dachte ich hätte auch mal was richtig gemacht^^
    Ne die sind falsch ich gebe sie einmal manuell ein

    EDIT:
    Ne leider funktioniert es nicht so ganz

    Ich habe 5 Buttons auf meiner Form
    und wenn ich den Focus auf dem Button 3 setze (also genau die Mitte) dann wenn ich nach links drücke springt der sofort zum linken letzen Button und wenn ich nach rechts gehen will dann muss ich mehrmals drücken aber dann springt der Focus sofort wieder am rechten letzen button :/
    (erklärung im Anhang)
    Bilder
    • erklärung3.png

      23,28 kB, 1.273×612, 35 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ClonkAndre“ () aus folgendem Grund: Wegen nachtrag

    1. In welcher Reihenfolge hast Du die Buttons in die Liste getan? Dies sollte auch die sichtbare Reihenfolge der Buttons auf dem Formular von links nach rechts sein. Also:

    VB.NET-Quellcode

    1. ButtonList.Add(BtnExit) 'ist später in der Liste mit Index = 0 erreichbar
    2. ButtonList.Add(BtnMsgBox1) 'ist später in der Liste mit Index = 1 erreichbar
    3. ButtonList.Add(BtnMsgBoxHello) 'ist später in der Liste mit Index = 2 erreichbar
    4. ButtonList.Add(BtnSettings) 'ist später in der Liste mit Index = 3 erreichbar
    5. ButtonList.Add(BtnCommand) 'ist später in der Liste mit Index = 4 erreichbar

    2. Welcher Button ist zum Anfang fokussiert?
    3. Welcher Wert steht in der Variable CurrentButtonIndex?
    2 und 3 müssen zusammen passen. Wenn BtnMsgBoxHello zum Anfang fokussiert ist, muss zum Anfang CurrentButtonIndex = 2 gesetzt sein, siehe Punkt 1 bei den Codeanmerkungen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    1: Ich hab Sie eigntlich genau richtig eigentlich angeordnet

    Quellcode

    1. (nav_buttons ist meine List Of Button)
    2. (Sind genau so angeordnet wie im Anhang von Post 14)
    3. nav_buttons.Add(quick_exit_btn)
    4. nav_buttons.Add(quick_hello_btn)
    5. nav_buttons.Add(quick_hello2_btn)
    6. nav_buttons.Add(quick_settings_btn)
    7. nav_buttons.Add(quick_opencmd_btn)


    2: Am Anfang ist der erste Button fokussiert also: quick_exit_btn
    3: CurrentButtonIndex = 0

    Wie meine test Form genau aussieht sieht man im Post 14 von mir
    Wie sieht Dein DPad-CurrentButtonIndex-Veränderungscode aus?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Genau so ich denke aber selbst das das falsch sein könnte

    VB.NET-Quellcode

    1. 'DPad
    2. If Buttons.Contains(XBox.Buttons.UP) = True Then
    3. ElseIf Buttons.Contains(XBox.Buttons.DOWN) = True Then
    4. ElseIf Buttons.Contains(XBox.Buttons.LEFT) = True Then
    5. CurrentButtonIndex -= 1
    6. If CurrentButtonIndex < 0 Then
    7. CurrentButtonIndex = nav_buttons.Count - 1
    8. nav_buttons(CurrentButtonIndex).Select()
    9. End If
    10. ElseIf Buttons.Contains(XBox.Buttons.RIGHT) = True Then
    11. CurrentButtonIndex += 1
    12. If CurrentButtonIndex = nav_buttons.Count - 1 Then
    13. CurrentButtonIndex = 0
    14. nav_buttons(CurrentButtonIndex).Select()
    15. End If
    16. End If
    17. 'ABXY
    18. If Buttons.Contains(XBox.Buttons.A) = True Then
    19. nav_buttons(CurrentButtonIndex).PerformClick()
    20. End If
    21. 'Left/Right Buttons
    22. 'Start/Select
    Zeile#11 und Zeile#19 müssen jeweils nach dem End If stehen. Sonst wird der jeweilige Button nur selektiert, wenn die "Außengrenzen überschritten wurden", also die If-Bedingungen wahr sind. Die Buttons sollen schließlich immer selektiert werden, wenn sich der Index ändert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Perfekt!
    Jetzt funk es besser doch ein Problem gibt es noch. Aber ich komme später wieder denn ich muss jetz leider weg.
    Also wenn ich wieder komme werde ich es euch/dir mitteilen
    (könnte sich auch auf morgen verschieben)

    danke erstmal für deine Hilfe wenn es nicht mehr heut geht dann morgen^^
    Es ist zwar gelöst, aber man hätte auch einfach Tab verwenden können, und die jeweiligen TabStop's anpassen.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!