Frage

Wie würde ich vorgehen, um ein „Gamepad“ zu erstellen, das für DirectInput-Anwendungen wie ein normaler Gamecontroller aussieht, der Status seiner Steuerelemente jedoch tatsächlich durch die Software definiert wird?

War es hilfreich?

Lösung

Schreiben Sie einen Gerätetreiber, um so zu tun, als wäre er einer.

Insbesondere verarbeiten Windows-Gerätetreiber sogenannte Interrupt-Anfragen über das Interrupt-Request-Protokoll – was auf eine verpackte Struktur und einen Satz interner Puffer im Treiber hinausläuft.

Das nächste, was Sie nun wissen müssen, ist, dass viele Treiber tatsächlich geschichtet oder gestapelt sind, oder wie auch immer Sie diesen Namen verwenden möchten.Um beispielsweise einen Festplattentreiber zu schreiben, können Sie eine Schnittstelle mit dem darüber liegenden Treiber (als Festplattenklasse) herstellen, aber einen darunter liegenden Treiber (z. B. einen SCSI-Port) verwenden, um tatsächlich Befehle an Ihre Geräte zu senden.

So funktionieren echte Geräte.Gefälschte Geräte müssen den Schnittstellenanforderungen der obersten Ebene entsprechen, z.eine Festplatte oder ein Controller oder eine Maus oder was auch immer es ist.Allerdings können sie im Hintergrund alles tun, was sie wollen – beliebige Werte zurückgeben.

Dies eröffnet die Möglichkeit, einen Treiber über eine Benutzermodus-Anwendung zu steuern und sich als „Gerät“ auszugeben.Um einem Fahrer Nachrichten zu senden, können Sie DeviceIoControl dazu;Um diese Nachrichten tatsächlich zu erhalten, können Sie dann entweder:

  • Stecken Sie sie in den IRP, aus dem DeviceIoControl besteht.
  • Lassen Sie sie vom Treiber aus dem Speicher Ihres Prozesses lesen.

Auch Fahrer können darauf zugreifen \\Registry\\Machine und verschiedene andere, nicht benutzerspezifische Nicht-Explorer-Registrierungsbereiche, sodass eine Kommunikation auf diese Weise möglich ist.

Schließlich lässt sich nicht sagen, dass Sie vorhandene E/A nicht filtern können, anstatt alles über ein neues Gerät zusammenzuführen.Es gibt sehr viele Möglichkeiten und Möglichkeiten, dies zu tun.

Wenn Sie dies tun möchten, benötigen Sie:

  • VirtualKD oder ein teures Debugger-Kabel und zwei PCs.
  • Wahrscheinlich möchten Sie auch mit den Referenzen beginnen dieser Blogbeitrag.Sie werden feststellen, dass es im Wesentlichen eine Unmenge verschiedener Namen für Treibercode gibt, daher werde ich einige davon interpretieren:

    • WDM = Windows Driver Model, im Grunde das NT-Treibermodell gemischt mit (einigen) Windows 9x.
    • KMDF = Kernel Mode Driver Framework – Treiber des oben genannten Typs verwenden dies und zusätzlich WDF (Windows Driver Foundation), eine Reihe von Bibliotheken zusätzlich zu WDM, um die Verwendung zu beschleunigen.
    • UMDF = User Mode Driver Framework – Schreiben Sie einen Treiber ohne die Gefahr des Kernelmodus.Wenn Sie können, verwenden Sie dies, da fehlerhafte Kernel-Modus-Treiber zu einem Bluescreen (im Treiberjargon: Bugcheck) Ihres Systems führen.

Bearbeiten:Ich kenne mich mit DirectInput nicht besonders gut aus – es gibt möglicherweise eine Möglichkeit, die verschiedenen verwendeten API-Steuerelemente über DLL-Umleitung und dergleichen zu überschreiben, was möglicherweise einfacher ist als die von mir beschriebene Methode.

Andere Tipps

Die einfachste Lösung kann sein, um ein Xinput-Gerät (Xbox 360 und eins) zu emulieren.Diese werden in den meisten modernsten Spielen unterstützt und das Setup ist sehr einfach.Hier ist ein C ++ - Projekt, das dies ohne installierte Treiber oder externe Abhängigkeiten bereitstellt: https://github.com/shauleiz/ vxboxinterface /

Es gibt Vjoy OpenSource-Projekt: http://sourceforge.net/projects/vjoystick/ -kann es wert sein, anzusehen.

Ich weiß, dass es eine alte Frage ist"> Vigem .

Sie können einige bekannte Gamepads wie Microsoft Xbox 360 Controller, Sony Dualshock 4 Controller und Microsoft Xbox One Controller emulieren.Das Projekt bietet auch einigen API, um mit diesen virtuellen Controllern zu interagieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top