Domanda

Come potrei creare un "gamepad" che appare alle applicazioni DirectInput come un normale controller di gioco ma lo stato dei suoi controlli è effettivamente definito dal software?

È stato utile?

Soluzione

Scrivi un driver di dispositivo per fingere di esserlo.

Nello specifico, i driver dei dispositivi Windows gestiscono le cosiddette richieste di interruzione tramite il protocollo di richiesta di interruzione, che si riduce a una struttura racchiusa e a una serie di buffer internamente al driver.

Ora la prossima cosa che devi sapere è che molti driver sono effettivamente stratificati, o impilati, o qualunque sia il nome che desideri utilizzare.Quindi, ad esempio, per scrivere un driver del disco, potresti interfacciarti con il driver sopra di esso (come una classe di dischi) ma utilizzare un driver sotto di esso (porta scsi, ad esempio) per inviare effettivamente comandi ai tuoi dispositivi.

Ecco come funzionano i dispositivi reali.I dispositivi falsi devono essere conformi ai requisiti di interfaccia di livello superiore, ad es.un disco, un controller, un mouse o qualunque cosa sia.Tuttavia, sotto sotto possono fare tutto ciò che vogliono: restituire i valori che preferiscono.

Ciò apre la possibilità di controllare un conducente tramite un'applicazione in modalità utente e fingere di "essere" un dispositivo.Per inviare messaggi all'autista, puoi farlo DeviceIoControl ad esso;quindi per ricevere effettivamente quei messaggi puoi:

  • Inseriteli nell'Irp che compone quel DeviceIoControl.
  • Chiedi al driver di leggerli dallo spazio di memoria del processo.

Possono accedere anche gli autisti \\Registry\\Machine e varie altre aree del registro non specifiche dell'utente e non dell'esploratore, quindi è possibile comunicare in questo modo.

Infine, non si può dire che non sia possibile filtrare l'IO esistente, piuttosto che inventare tutto tramite un nuovo dispositivo.Ci sono moltissime opzioni e modi per farlo.

Se hai intenzione di farlo, avrai bisogno di:

  • VirtualKD oppure un costoso cavo del debugger e due PC.
  • Probabilmente vorrai anche iniziare con i riferimenti questo post del blog.Scoprirai che esistono essenzialmente un'infinità di nomi diversi per il codice del driver, quindi ne interpreterò alcuni:

    • WDM = Windows Driver Model, sostanzialmente il modello di driver NT mescolato con (alcuni) Windows 9x.
    • KMDF = Framework driver in modalità kernel: i driver del tipo sopra indicato lo utilizzano, oltre a WDF (Windows Driver Foundation) che è un insieme di librerie sopra WDM per renderlo più veloce da usare.
    • UMDF = Framework driver in modalità utente: scrive un driver senza il pericolo della modalità kernel.Se puoi, usalo, poiché i driver in modalità kernel che vanno male faranno lo schermo blu (nel gergo dei driver, controllo bug) del tuo sistema.

Modificare:Non ho una conoscenza approfondita di DirectInput: potrebbe esserci un modo per sovrascrivere i vari controlli API in uso tramite reindirizzamento DLL e simili, il che potrebbe essere più semplice del modo che ho descritto.

Altri suggerimenti

La soluzione più semplice potrebbe essere quella di emulare un dispositivo Xinput (Xbox 360 e uno).Questi sono supportati nella maggior parte dei giochi moderni e il set-up è molto semplice.Ecco un progetto C ++ qui che fornisce questo senza driver installati o dipendenze esterne: https://github.com/shauleiz/ vxboxinterface /

C'è vjoy opensource progetto: http://sourceforge.net/projects/vjoystick/ -può valere la pena guardare.

So che è una vecchia domanda ma per chiunque sia interessato a questo argomento Vale anche la pena guardare questo progetto chiamato Vigem .

È possibile emulare alcuni gamepad ben noti come il controller Microsoft Xbox 360, il controller Sony DualShock 4 e il controller Microsoft Xbox ONE controller.Il progetto offre anche alcune API per interagire con questi controller virtuali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top