10
votes

Comment créer un gamepad virtuel?

Comment créerais-je créer un "gamepad" qui semble diriger des applications sous forme de contrôleur de jeu normal, mais l'état de ses commandes est en fait défini par logiciel?


0 commentaires

5 Réponses :


11
votes

Écrivez un pilote de périphérique pour prétendre être un.

Plus précisément, les pilotes de périphérique Windows manipulent les demandes d'interruption appelées interruptions via le protocole de demande d'interruption - qui se résume à une structure enveloppée et à un ensemble de tampons interne dans le conducteur.

Maintenant, la prochaine chose que vous devez savoir, c'est que de nombreux pilotes sont réellement superposés, ou empilés ou quel nom que vous souhaitez utiliser. Ainsi, par exemple pour écrire un pilote de disque, vous pouvez interfacer avec le pilote au-dessus de celui-ci (en tant que classe de disque), mais utilisez un pilote ci-dessous (port SCSI, par exemple) pour envoyer des commandes à vos appareils.

Voilà comment fonctionnent les appareils réels. Les faux dispositifs doivent être conformes aux exigences de l'interface de niveau supérieur, par ex. un disque, un contrôleur ou une souris, ou quoi que ce soit. Cependant, en dessous, ils peuvent faire tout ce qu'ils aiment - renvoyer toutes les valeurs qu'ils aiment.

Cela ouvre la possibilité de contrôler un pilote via une application en mode utilisateur et prétendant «être» un périphérique. Pour envoyer des messages de pilote, vous pouvez DeviceIocontrol à celui-ci; Ensuite, pour obtenir ces messages, vous pouvez soit:

  • les trucs dans le IRP qui compose ce appareilIOCONTROL.
  • Demandez au pilote les lire de votre espace de mémoire de votre processus.

    Les pilotes peuvent également accéder à \\ registre \\ machine et divers autres zones de registre non explorateur spécifiques à l'utilisateur, il est donc possible de communiquer de cette façon.

    Enfin, rien ne dit que vous ne pouvez pas filtrer l'IO existant, plutôt que de tout faire via un nouvel appareil. Il y a de nombreuses options et des moyens de faire cela.

    Si vous allez faire cela, vous aurez besoin de:

    • virtualkd ou un câble de débogueur coûteux et deux pcs.
    • Vous voulez probablement aussi commencer par les références sur Ce blog post . Vous constaterez qu'il y a essentiellement un bazillion de noms différents pour le code du conducteur, donc je vais en interpréter certains d'entre eux:

      • WDM = modèle de pilote Windows, fondamentalement le modèle de pilote NT mélangé à (certaines des) Windows 9x.
      • KMDF = Cadre de pilote en mode Kernel - Pilotes du type ci-dessus Utilisez ceci, ainsi que la Fondation de pilotes Windows WDF (Windows Driver) qui est un ensemble de bibliothèques au-dessus de WDM pour le rendre plus rapide.
      • UMDF = Cadre de pilote en mode utilisateur - Écrivez un pilote sans danger de mode de noyau. Si vous le pouvez, utilisez-le, car les pilotes en mode de noyau qui vont mal sera bluescreen (dans le langage de pilote, bugcheck) votre système.

        EDIT : Je ne suis pas très bien informé sur DirectInput - il peut y avoir un moyen de remplacer les différentes commandes d'API utilisées via la redirection de la DLL et similaires, ce qui peut être plus simple que la façon dont je ' vu décrit.


2 commentaires

Merci pour l'intro du conducteur Dev! Mon intention actuelle est de corriger le support DirectInput de 360 ​​contrôleur. Actuellement, vous pouvez l'utiliser avec DI mais avec des limitations; Impossible d'aborder les déclencheurs séparément, vous ne pouvez pas utiliser les déclencheurs en tant que boutons (afin que cela ne fonctionne pas avec quoi que ce soit d'attente de quatre boutons d'épaule), et non vibrante [...]


[...] ation. Votre édition était mon intention initiale; Mais DI n'utilise pas les fonctions traditionnellement liées, mais ne relie que DirectInputCreate qui renvoie une structure avec des pointeurs de fonction, et il semble également fournir différentes interfaces pour C et C ++. Cela m'a éteint cet itinéraire, mais un faux pilote semble encore plus difficile, alors je pense que je vais lui donner un autre essai. (Avant que quiconque suggère XBCD, il brise le support de Xinput natif.)



4
votes

Il y a VJOY OpenSource Project: http://sourceforge.net/projects/vjoystick/ - peut être la peine d'être regardé.


1 commentaires

En outre, il pourrait y avoir des liaisons pour VJOY dans votre langue de choix - par ex. Github.com/tidzo/pyvjoy pour Python, que je n'ai pas utilisé mais je suis impatient de.



5
votes

La solution la plus facile peut consister à imiter un dispositif Xinput (Xbox 360 et un). Celles-ci sont soutenues dans la plupart des jeux modernes et la mise en place est très simple. Voici un projet C ++ ici qui fournit cela sans pilotes installés ni dépendances externes: https://github.com/shauleiz / vxboxterface /


1 commentaires

Ce n'est pas vrai. Vous devez installer le SCPVBUS sur votre système afin d'utiliser cette API pour les interactions de gamepad virtuelles. Il suffit de regarder cette note de publication .



2
votes

Je sais que c'est une vieille question, mais pour toute personne qui s'intéresse à ce sujet, il convient également de regarder ce projet appelé Vigem .

Vous pouvez imiter des cartes de jeu bien connues telles que Microsoft Xbox 360 Controller, contrôleur Sony Dualshock 4 et contrôleur Microsoft Xbox One. Le projet propose également une API d'interagir avec ces contrôleurs virtuels. Par exemple. L'API C # peut être trouvé ici


0 commentaires

0
votes

La solution la plus simple que j'ai trouvée utilisait Vjoy et son enveloppe C #. Vous devez télécharger le pilote VJOY à partir d'ici.

Vous pouvez utiliser le VJOY SDK pour la mise en œuvre d'un programme d'alimentation: https : //github.com/njz3/vjoy/tree/master/sdk/c%23

Utilisez le projet de démarreur C # pour cela, ou ajoutez simplement les deux .dll -S à votre projet existant sous forme de références dans le dossier X86 ou X64. Vous pouvez trouver des instructions sur la manière d'utiliser l'API dans le fichier README.ODT.


0 commentaires