29 votes

Superposition sur une application 3D plein écran

Je veux afficher des graphiques personnalisés sur le dessus de la 3ème partie en plein écran de l'application Windows.

Avez-vous joué à aucun des jeux Steam? Il dispose d'un exécutable, GameOverlayUI.exe qui vous permet d'accéder à la Vapeur windows à partir d'un jeu. (Les éléments d'interface look personnalisé-dessinée, je ne sais pas si c'est une nécessité; mais ils regardent exactement la même à l'intérieur d'un jeu comme ils le font sur le bureau.) Il va même jusqu'à 'dim' les graphismes du jeu en arrière-plan.

Je me demandais comment on pouvait aller sur l'écriture d'une telle demande.

Je me demande aussi comment large du champ d'application de solutions. Utilisez-vous une méthode pour toutes les applications OpenGL? Pour tous les Direct3D moins DirectDraw applications? Pour tous les plein écran des applications Windows?

Je suis à la recherche pour les plus "modernes" et les solutions génériques - la superposition d'une invite de commande ou un 320x240 couleurs indexées application n'est pas un sujet de préoccupation.

Edit: Quelques précisions: Les applications plein écran n'est pas la mienne. Il peut être n'importe quoi. Plus probablement, il sera un jeu en 3D. Je veux afficher, dire une horloge numérique dans le coin inférieur droit de l'écran, au-dessus des graphismes du jeu. Je voudrais éviter les trucs comme l'injection de code ou de débogage du processus, si possible.

16voto

shaun Points 614

Eh bien, voici un autre exemple. Xfire est un programme de chat qui se superpose à son interface dans les jeux de sorte que vous pouvez recevoir des messages tout en jouant. La façon dont ils le font c'est en modifiant le d3d/opengl DLL à la mémoire de processus de niveau, comme l'injection de l'assemblée des sauts. Je le sais parce que leur méthode était la cause de mon mod crash, et j'ai effectivement vu l'étrange assemblage de code qu'ils ont été d'injecter dans le d3d9.dll.

Voici donc comment Xfire fait ceci:

  1. cible le processus du jeu
  2. la recherche de son processus de mémoire pour d3d.dll/opengl.dll
  3. injecter dans le processus d'une DLL contenant la logique de l'interface personnalisée
  4. connectez l'interface des fonctions pour le déroulement du programme par l'écriture manuelle de l'assemblée des sauts dans le d3d/fonctions opengl trouve dans le processus de la mémoire

Il n'y a pas d'autre voie envisageable, car vous avez besoin de détourner le périphérique graphique qui appartient à ce jeu. Je suis prêt à parier que la Vapeur est-il de la même façon que Xfire. Donc oui, pas de moyen facile de le faire si quelqu'un a créé un utile bibliothèque pour faire tout ce que vous devez faire au niveau bas.

Vous avez également posé des questions sur la gradation de l'graphismes du jeu sous votre superposition. C'est juste une simple DrawPrimitive appel à dessiner une fois rempli, un rectangle transparent sur l'écran.

13voto

shaun Points 614

C'est un assez ésotérique de l'art, et il y a plusieurs façons de le faire. Je préfère ce qu'on appelle un Direct3D Wrapper. Cela fait des années depuis que j'ai fait, mais je l'ai fait avec un jeu une fois. J'ai peut-être laissé de côté certains détails, mais j'espère juste pour illustrer l'idée.

Tous les Direct3D9 jeux devez appeler IDirect3DDevice9::EndScene après l'écran est rendu et prête à être utilisée. Donc, en théorie, on peut mettre un code personnalisé à l'intérieur d' EndScene qui attire ce que nous voulons sur le jeu. Pour cela, nous créons une classe qui ressemble à IDirect3DDevice9 pour le jeu, mais c'est vraiment juste un wrapper qui transfère tous les appels de fonction à la classe réelle. Alors maintenant, dans notre classe personnalisée, notre fonction wrapper pour EndScene ressemble à ceci:

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

   realDevice.EndScene();
}

Ensuite, nous les compiler dans une DLL appelée d3d9.dll et déposez-le dans l'exécutable du jeu du répertoire. Le réel d3d9.dll doit être dans le dossier system32, mais le jeu a l'air d'abord dans le répertoire courant, et à la place des charges de la nôtre. Une fois le chargement du jeu, il utilise notre DLL pour créer une instance de notre classe wrapper. Et maintenant chaque fois qu' EndScene est appelé, notre code est exécuté à dessiner ce que nous voulons à l'écran.

Je pense que vous pouvez essayer le même principe avec OpenGL. Mais pour empêcher toute manipulation, je pense que certains jeux modernes essayer d'éviter cela.

2voto

Car Points 1

therers un projet de logiciel libre son nom c'est le texte du lien taksi. Je ne sais pas comment cette application remplace le processus car je suis en train d'examiner le code, mais vérifiez que je pense que c'est un bon projet

-1voto

moobaa Points 3794

J'ai fait des superpositions avec les fenêtres DirectX et WPF (même chose, vraiment), en utilisant la superposition pour peindre de belles choses 2D GDI + en plus des visualisations 3D.

J'ai réussi à utiliser un panneau au-dessus de la visualisation "réelle", en définissant la couleur sur transparent, sauf pour les bits que je voulais superposer. Fonctionnait assez bien, mais c'était un peu pénible de passer un clic, un glissement et d'autres événements à travers le calque "dessin" vers le contrôle 3D.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X