Domanda

Voglio mostrare alcune grafica personalizzata sulla cima di un 3rd party a schermo intero applicazioni di Windows.

Hai giocato uno dei giochi Steam?È un eseguibile, GameOverlayUI.exe che consente di accedere a Vapore finestre dall'interno di un gioco.(Elementi dell'interfaccia, look personalizzato disegnato, non so se è una necessità;ma sembrano esattamente la stessa all'interno di un gioco come sul desktop.) Si va ancora più lontano di 'dim' la grafica del gioco in background.

Mi chiedo come si possa andare sulla scrittura di un'applicazione.

Mi chiedo anche quanto sia ampio il campo di applicazione di soluzioni sarebbe.Si potrebbe utilizzare un metodo per tutte le applicazioni OpenGL?Per tutte le Direct3D meno DirectDraw applicazioni?Per tutte le Finestre a schermo intero applicazioni?

Sto cercando più 'moderno' e soluzioni generiche - sovrapposizione di un prompt dei comandi o un 320x240 a colori indicizzati applicazione non è una preoccupazione.

Edit:Alcuni chiarimenti:Il fullscreen applicazione non è mio.Può essere qualsiasi cosa.Più probabilmente, sarà un gioco in 3D.Voglio visualizzare, per esempio un orologio digitale in basso a destra dello schermo, sopra la grafica del gioco.Vorrei evitare di trucchi, come ad esempio l'iniezione di codice o il processo di debug, se possibile.

È stato utile?

Soluzione

Bene, ecco un altro esempio.Xfire è un programma di chat che si sovrappone la sua interfaccia in giochi in modo da poter ricevere i messaggi durante la riproduzione.Il modo in cui farlo è attraverso la modifica del d3d/opengl DLL al processo livello di memoria, come l'iniezione di montaggio salti.So questo perché il loro metodo è stato la causa della mia mod crash, e in realtà ho visto lo strano codice assembly erano di iniettare nel d3d9.dll.

Quindi, ecco come Xfire fa questo:

  1. target il processo del gioco
  2. ricerca il suo processo di memoria per d3d.dll/opengl.dll
  3. iniettare nel processo di una DLL che contiene l'interfaccia personalizzata di logica
  4. collegare l'interfaccia di funzioni per il flusso del programma scrivendo manualmente assemblea salti in d3d/opengl funzioni della memoria del processo

Non c'è altro modo concepibile, in quanto è necessario dirottare la grafica dispositivo che appartiene a quel gioco.Sono pronto a scommettere che il Vapore fa, allo stesso modo, come Xfire.Quindi sì, esiste un modo semplice per farlo, a meno che qualcuno ha creato un utile libreria di fare tutto il necessario per fare un basso livello.

Ci avete chiesto di regolazione della luminosità la grafica del gioco sotto il tuo sovrapposizione.Questo è solo un semplice DrawPrimitive chiamata a disegnare un rettangolo trasparente sullo schermo.

Altri suggerimenti

Creato un Gist con codice completo qui

Questo è un piuttosto esoterico arte, e ci sono diversi modi per fare questo.Io preferisco quello che viene chiamato un Direct3D Wrapper.È stato anni da quando ho fatto questo, ma l'ho fatto con un gioco di una volta.Forse ho lasciato fuori alcuni dettagli, ma spero solo per illustrare l'idea.

Tutti Direct3D9 giochi bisogno di chiamare IDirect3DDevice9::EndScene dopo la schermata di rendering e pronto per essere estratto.Quindi, in teoria, siamo in grado di mettere il custom codice all'interno EndScene che disegna quello che vogliamo da gioco.Facciamo questo attraverso la creazione di una classe simile IDirect3DDevice9 per il gioco, ma è davvero solo un wrapper per l'inoltro di tutte le chiamate di funzione reale di classe.Adesso, quindi, nella nostra classe, la nostra funzione wrapper per EndScene assomiglia a questo:

HRESULT IDirect3DDevice9::EndScene()
{
   // draw overlays here

   realDevice.EndScene();
}

Poi ci compilarlo in una DLL chiamata d3d9.dll e cadere nel gioco di directory dell'eseguibile.Il vero d3d9.dll dovrebbe essere in /system32, ma il gioco prima ricerca nella directory corrente, e invece carichi il nostro.Una volta che si carica il gioco, utilizza il nostro DLL per creare un'istanza della nostra classe wrapper.E ora ogni volta che EndScene è chiamato, il nostro codice è eseguito a disegnare quello che vogliamo schermo.

Penso che si può provare lo stesso principio con OpenGL.Ma per evitare la manomissione, penso che alcuni giochi moderni cercare di evitare questo.

therers un progetto di software libero il suo nome è taksi testo del link . Io non sono sicuro di come questa applicazione ignorare il processo perche 'sono esaminerà il codice ancora, ma CheckIt penso che questo sia un buon progetto

Ho riflettuto su questo. Per OpenGL, mi aggancio SwapBuffers di WGL con Detours, disegnando la mia roba dopo la partita e poi scambiare i buffer me stesso.

Ho fatto sovrapposizioni con entrambe le DirectX & WPF finestre (stessa cosa, in realtà), con la sovrapposizione di dipingere qualche bel GDI + 2D roba in cima visualizzazioni 3D.

Sono riuscito utilizzando un pannello sulla parte superiore della visualizzazione "reale", impostare il colore trasparente, fatta eccezione per i bit I wanted sovrapposto. Ha funzionato abbastanza bene, ma era un po 'un dolore che passa clic, trascinare e altri eventi attraverso lo strato di "disegno" per il controllo 3D.

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