Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.03.2017, 20:19

Auslesen eins ( PS4)-Controllers mit RawInput

So, ich habe mich gewundert ob man einen PS4-Controller (kann von mir aus auch jeder andere Controller sein) an einen Computer anschließen kann. Ich wollte dann versuchen die Tastendrücke auszulesen. Ich habe dann im Internet gesucht und gefunden das sowas mithilfe von sogenanntem RawInput möglich sein soll. Ich habe dafür im Internet auch diese Klasse gefunden (C#)



So wenn man jetzt Tastaturanschläge auslesen will funktioniert das auch gut so. Beispiel:


Mein Problem ist das funktioniert nur mit Tastaturen. Wie bekomme ich das hin das Controller ausgelesen werden können wie z. B. das ich auf dem PS4-Controller irgendeine Taste drücke und ich dann diese Eingabe am Computer in irgendeinem Wert bekomme.

Mfg

Goldwing Studios

Treue Seele

Beiträge: 359

Wohnort: Heidelberg

Beruf: Softwareentwickler, Vertriebler

  • Private Nachricht senden

2

29.03.2017, 13:13

Hi,

hier habe ich was gefunden. Ist zwar für den PS3 Controller, aber vielleicht kannst du da ja was drüber basteln.

https://www.codeproject.com/articles/236…-usb-hid-as-inp

3

29.03.2017, 14:15

Danke für deine Antwort Goldwing Studios!

Allerdings ist dort das Problem das da dort steht das man da einen speziellen Treiber installieren soll und diesen scheint es nicht mehr zu geben (die Website existiert nicht).

Goldwing Studios

Treue Seele

Beiträge: 359

Wohnort: Heidelberg

Beruf: Softwareentwickler, Vertriebler

  • Private Nachricht senden

5

29.03.2017, 17:48

Nach dem ich jetzt auch nochmal was gesucht habe, habe ich diesen Reddit-Post gefunden: https://www.reddit.com/r/csharp/comments/5qfif6/help_retrieve_ps4_controller_data_using_raw_input/

Aus diesem habe ich mir dann folgenden Code gebastelt:






Und ich muss sagen das funktioniert ganz gut. Die Konsole gibt die einzelnen Messages aus und erkennt auch den Controller.
Beispiele sind zum Beispiel das wenn ich mit der Maus über das Fenster "fahre" das dann immer wieder die Werte "132, 132, 32, 512" in die Konsole geschrieben werde. Wenn ich mit der Maus die Position des Fensters ändere werden die Werte "534, 70, 36, 71, 3" geschrieben.

Jetzt kommen wir aber zum Controller:
Wenn ich den Controller anschließe wird der auch erkennt, registriert und das auch in die Konsole geschrieben. Es wird dann dauerhaft der Wert "255" in die Konsole geschrieben. Wenn ich, während das Programm noch läuft, den Controller abzieht erscheint einmalige eine "537" in der Konsole. Bis jetzt ganz gut scheint ja alles zu funktionieren.

Das Problem ist jetzt das nichts passiert wenn ich z.b. den X-Knopf drücke. Es wird kein neuer Wert in die Konsole geschrieben? Wie soll ich so prüfen ob z.b. die X-Taste gedrückt wurden.

Funktioniert das alles richtig und ich verstehe was nicht. Oder ist da ein Fehler?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »GameXCraft« (29.03.2017, 19:56)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

30.03.2017, 12:50

Soweit ich weiß benötigst du für PS Controller spezielle Treiber. Ich benutze einen PS3 Controller zum zocken und habe da eine extra Software im Hintergrund laufen. XBox Gamepads werden von Windows 10 direkt erkannt. Ich würde jetzt an deiner Stelle gucken dass du einfach allgemeinen Gamepad Support für dein Spiel lieferst. Wenn jetzt jemand mit einem PS Gamepad spielen möchte muss er halt selbst dafür sorgen dass das Gamepad auch läuft. Man könte ja auch irgendwelche anderen exotischen Pads zum spielen nutzen. Da würde sich der Spieler ja auch selbst um die Treiber kümmern. Vor allem bin ich mir nicht sicher was passiert wenn der Spieler irgendwelche Treiber installiert hat und dein Spiel dann da selbst rum fuckelt. Ob es dadurch nicht zu weiteren Problemen kommen könnte. So etwas würde ich zumindest vorher mal testen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

30.03.2017, 14:50

Hi, Schorsch

Das man für den PS3 Controller bestimmte Treiber brauch weiß ich allersdings habe ich schon öfters gehört das das beim PS Controller nicht mehr da lass sein soll. Hier zum Beispiel ein http://www.giga.de/konsolen/playstation-4/tipps/ps4-controller-mit-pc-verbinden-so-wird-es-gemacht-kabel-und-bluetooth/ dazu.

Zitat

Während sich der Xbox 360-Controller problemlos mit dem Computer verbinden ließ, schauten PS3-Besitzer ins Schwarze, wenn das Gamepad am Rechner angeschlossen wurde. Die Verbindung zwischen PS3-Controller und PC funktionierte nur über Umwege. Doch wie sieht das aus, wenn man seinen PS4 Controller mit dem PC verbinden möchte?

Sony hat bei dieser Konsolengeneration mitgedacht und ermöglicht eine einwandfreie Verbindung zwischen PlayStation 4-Gamepad und PC. Einmal per USB angeschlossen, wird der Controller sofort erkannt und kann für PC Games benutzt werden.[qoute]
- http://www.giga.de/konsolen/playstation-…-und-bluetooth/


Kann aber natürlich trotzdem stimmen was du sagst!

Ich habe jetzt noch mal ein bisschen weitergearbeit und noch diese Funktion in die "PS4Input"-Klasse hinzugefügt.


Und habe die übergeschriebene WndProc-Funktion der Form (Input) so geändert:
protected override void WndProc(ref Message message)
{
PS4Input.ProcessInput(message.LParam);
base.WndProc(ref message);
}

So es ist jetzt immer noch der Fall das der Controller entweder keine Daten aussendet oder die trotz Registierungen nicht ausgelesen werden können oder so. Das selbe ist mit der Tastatur. Das einzige was zu funktionieren scheint ist die Maus (warum auch immer). Wenn ich nichts am meinen PC mache wird dort nun dauert eine 1 in die Konsole geschrieben. Wenn ich mit der Maus über das Fenster fahre wird ab und zu der Wert "3019532" in die Konsole geschrieben. Manchmal entstehen dann auch so komische Textblöcke die größtenteils aus Fragezeiczhen bestehen. Allerdings erscheinen keine anderen Werte wenn den Controller benutze und darauf irgendwas drücke. Hier ist noch mal ein Bild was die Konsole zeigt:

(Link)


Mfg

8

31.03.2017, 17:41

Hi, ich dachte erst ich hätte die Lösung gefunden aber die Lösung hat irgendwie ein neues Problem erzeugt :(

Es liegt/lag an dem RawHid Struct

C#-Quelltext

1
2
3
4
5
6
internal struct RawHid
{
public int Size;
public int Count;
public byte Data;
}


Da war der Fehler das man noch unter das "public byte Data" weitere Bytes schreiben kann. Ich habe die Struktur zu dem hier geändert

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
internal struct RawHid
{
public int Size;
public int Count;
public byte Data;
public byte data1
public byte data2
public byte data3
public byte data4
public byte data5
public byte data6
}


Und das funktioniert komischerweise sogar :) Die Bytes "data1" bis "data6" liefern alle wichtigen Informationen.
Beispielsweise gibt data5 immer "8" aus. Wenn man aber auf den X-Knopf drückt erscheint dann kurz eine "40".

Ja, sieht alles so aus als würde es funktionieren :)

Nope. Ich weiß absolut nicht warum, weil mit der Tastatur und der Maus funktioniert es allerdings wenn ich dann so ein HID also hier in diesem den Controller auslese stürzt das Programm nach ungefähr 20 Sekunden ab.

Fehlermeldung: FatalExecutionEngineException. Es liegt ein schwerwiegender Fehler in der Lautzeit vor.

Warum? :(

9

31.03.2017, 19:48

Ok ich habe jetzt noch mal alles in ein kompaktes Beispiel gepackt.
Wer mir helfen will kann sich das gerne mal herunterladen: Der Link zum Projekt (Link überarbeitet, weil der andere nicht funktioniert hat)

Falls ihr einen PS4-Controller besitzt (oder einen Controller der als "HID-compliant Gamepad Device" markiert ist) könnt ihr das dann auch selbst testen. HID-compliant Gamepad Device ist eigentlich jeder Controller der keinen extra Treiber oder Hack braucht. Also PS4, Xbox 360. Ob das mit dem PS3-Controller geht weiß ich nicht.


Dieses ganze Problem nervt mich langsam richtig. Wenn ihr noch Ideen habt oder irgendwelche Fehler findet wäre ich dankbar wenn ihr mir die sagen würdet. Wenn ihr keine Ideen mehr habt oder das Problem "unlösbar" ist dann lass ich das. Aber noch geb ich nicht auf :)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »GameXCraft« (31.03.2017, 20:35)


Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

10

31.03.2017, 20:31

Das Problem ist nicht unlösbar, aber definitiv weit außerhalb Deiner Liga. Sorry. Das alte DirectInput kann alle möglichen GamePads unterstützen, darunter auch (wenn ich mich recht erinnere) den PS3-Controller. Nimm das, dafür gibt's sicher auch ein Binding für C#. Wenn Du dagegen RawInput verwenden willst, bist Du auf dem Level einzelner USB-Transaktionen unterwegs, und leider ziemlich tief im Treiber-Bereich. Lies Dir die USB-Spezifikation durch und guck, ob Du aus deren Daten-Transfers schlau wirst.

[Edit] Oh, und falls Du die 64bit-Version der RawInput-DLL benutzt - da ist ein Bug im Speicherlayout drin. Schau Dir mal den Source von https://github.com/Schrompf/sniis an, speziell WinMouse.cpp. Da ist ein fieser aber notwendiger Workaround drin, ohne den Du immer Grütze lesen wirst.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige