¿Cómo podría crear un "gamepad" que aparece en las aplicaciones DirectInput como un controlador de juegos normal, pero el estado de sus controles está realmente definido por el software?¿Cómo creo un gamepad virtual?
Respuesta
Escriba un controlador de dispositivo para pretender ser uno.
Específicamente, los controladores de dispositivos de Windows manejan lo que se denomina solicitudes de interrupción a través del protocolo de solicitud de interrupción, que se reduce a una estructura envolvente y un conjunto de almacenamientos intermedios internos en el controlador.
Ahora, lo siguiente que debe saber es que muchos controladores están en capas, apilados o el nombre que quiera usar. Por ejemplo, para escribir un controlador de disco, puede interactuar con el controlador que se encuentra arriba (como una clase de disco) pero use un controlador debajo de él (puerto scsi, por ejemplo) para enviar comandos a sus dispositivos.
Así es como funcionan los dispositivos reales. Los dispositivos falsos deben cumplir con los requisitos de interfaz de nivel superior, p. un disco, o un controlador, o un mouse, o lo que sea. Sin embargo, debajo pueden hacer lo que quieran, devolver los valores que deseen.
Esto abre la posibilidad de controlar un controlador a través de una aplicación en modo de usuario y pretender "ser" un dispositivo. Para enviar un mensaje al conductor, puede llamarlo al DeviceIoControl
; luego, para obtener realmente esos mensajes, puede:
- Rellenarlos en el Irp que compone ese DeviceIoControl.
- Haga que el controlador los lea fuera del espacio de memoria de su proceso.
Los conductores también pueden acceder a \\Registry\\Machine
y varias otras áreas de registro no explorer no usuarios específicos, por lo que es posible comunicarse de esa manera.
Por último, no hay forma de decir que no se puede filtrar E/S existente, en lugar de hacerlo todo a través de un nuevo dispositivo. Hay muchas opciones y formas en que puede hacer esto.
Si vas a hacer esto, necesitará:
- VirtualKD o un cable depurador caro y dos PC.
Probablemente también desee comenzar con las referencias en this blog post. Usted encontrará que hay esencialmente un bazillion diferentes nombres para código del controlador, así que voy a interpretar algunos de ellos:
- WDM = Windows Driver Model, básicamente el modelo de controlador NT mezclado con (algunos) de Windows 9x .
- KMDF = Marco del controlador en modo kernel: los controladores del tipo anterior usan esto, además de WDF (Windows Driver Foundation) que es un conjunto de bibliotecas encima de WDM para que sea más rápido de usar.
- UMDF = Marco de controlador de modo de usuario: escriba un controlador sin el peligro del modo kernel. Si puede, use esto, ya que los controladores en modo kernel que salen mal formarán una pantalla azul (en el lenguaje del conductor, comprobación de errores) de su sistema.
Editar: No estoy bien informado en forma masiva DirectInput - puede haber una forma de anular los diversos controles de la API en uso a través de la redirección de DLL y similares, que puede ser más simple que la forma en que ya lo he descrito
Hay proyecto opensource de vJoy: http://sourceforge.net/projects/vjoystick/ - puede valer la pena mirar.
La solución más fácil puede ser emular un dispositivo XInput (Xbox 360 y One). Estos son compatibles con la mayoría de los juegos modernos y la configuración es muy simple. Aquí hay un proyecto de C++ que proporciona esto sin controladores instalados o dependencias externas: https://github.com/shauleiz/vXboxInterface/
Eso no es verdad. Tienes que instalar ScpVBus en tu sistema para usar esta API para las interacciones virtuales del gamepad. Solo mire esta [nota de publicación] (https://github.com/shauleiz/vXboxInterface/releases/tag/v1.0.0). – grill2010
Sé que es una vieja pregunta, pero para cualquiera que esté interesado en este tema también vale la pena mirar este proyecto llamado ViGEm.
Puedes emular algunos juegos conocidos como los controladores Microsoft Xbox 360, Sony DualShock 4 y Microsoft Xbox One. El proyecto también ofrece algunas API para interactuar con estos controladores virtuales.
- 1. Android ADK - Trabajando en un gamepad
- 2. Android: enumerando los botones en un gamepad
- 3. Código de Gamepad en OS X: Buh?
- 4. Creo que he redefinido un método virtual pero sigo obteniendo: "X debe implementar el método virtual puro heredado Y"
- 5. ¿Cómo creo un recurso dll
- 6. ¿Cómo creo un UIViewController programáticamente?
- 7. ¿Cómo creo un niño NSManagedObjectContext?
- 8. Cómo creo un Mailer Observer
- 9. ¿Cómo creo un UITextField transparente?
- 10. ¿Cómo creo un texto coloreado?
- 11. Punto de inicio para codificar un dispositivo virtual
- 12. ¿Cómo creo un panel alfa mezclado?
- 13. Cómo detectar un botón del gamepad presione en OSX 10.5 y superior?
- 14. ¿Cómo creo un temporizador en WPF?
- 15. ¿Cómo creo un índice DESC en MySQL?
- 16. ¿Cómo creo un alias de Bash?
- 17. ¿Cómo creo un rango de HTML5 degradante?
- 18. ¿Cómo creo un programa Java ejecutable?
- 19. Word/OpenXML - ¿Cómo creo un marcador oculto?
- 20. ¿Cómo creo un operador en Haskell?
- 21. ¿Cómo creo un script de configuración?
- 22. Cómo creo un json en clojurescript
- 23. ¿Cómo creo un VirtualHost en Zend Server?
- 24. ¿Cómo creo un JAR con m2e (m2eclipse)?
- 25. En SQLAlchemy, ¿cómo creo un par único?
- 26. ¿Cómo creo un elemento canvas en Dart?
- 27. ¿Cómo creo un grupo de subprocesos?
- 28. ¿Cómo creo un jar distributable para javadocs?
- 29. ¿Cómo creo un MessageBox en C#?
- 30. ¿Cómo creo un directorio desde Emacs?
¡Gracias por la introducción al controlador de desarrollo! Mi intención real es arreglar el soporte DirectInput del controlador 360. Actualmente, puede usarlo con DI, pero con limitaciones; no puede direccionar los desencadenadores por separado, no puede usar los desencadenantes como botones (por lo que no funcionará con nada esperando cuatro botones de reborde), y no vibr [...] – Dataflashsabot
ation. Tu edición fue mi intención original; pero DI no utiliza funciones tradicionalmente vinculadas, sino que vincula solo a DirectInputCreate que devuelve una estructura con punteros a funciones, y también parece proporcionar diferentes interfaces para C y C++. Eso me desvió de esa ruta, pero un controlador falso se ve aún más difícil, así que creo que lo intentaré de nuevo. (Antes de que alguien sugiera XBCD, se rompe el soporte de xinput nativo). – Dataflashsabot