2010-12-07 99 views
16

SalutationsWPF - Transparence - Contenu de bureau en streaming

Je suis en train de créer un tableau de bord pour un jeu (Starcraft II). Ce tableau de bord est fait en tant qu'application WPF avec un code C# derrière. J'ai déjà une version qui fonctionne pour 90% en WinForms mais je manquais de soutien pour faire facilement l'air beaucoup plus agréable qui sont disponibles dans WPF.

Le point de cette demande sera de former une sorte de superposition sur le dessus d'un jeu de course. Ce jeu est en Fulscreen (fenêtré mode) alors quand en WinForms je codé afin qu'il doit toujours être au-dessus. Ce serait le cas et ce n'était pas un problème. Comme l'aspect principal de l'application dans WPF est basé sur une image avec un arrière-plan transparent, j'ai défini la plupart des valeurs d'arrière-plan sur Transparent. Cependant, lorsque je fais cela, toute l'application n'est pas enregistrée en streaming. Par exemple, il montre juste mon bureau ou le jeu que je joue mais pas mon application même si elle est là. Je peux le voir de mes propres yeux, mais le public sur le flux ne peut pas.

Quelqu'un a-t-il de l'expérience dans ce domaine parce que c'est vraiment mon cas. Toute l'application sera inutile si elle n'est pas visible sur les flux. Si je dois mettre l'arrière-plan sur une couleur plutôt que sur la transparence, l'interface utilisateur sera complètement démolie en termes d'apparence.

Je suis en train d'essayer de faire une superposition de jeu en C# & WPF. J'ai lu que vous pouvez le faire de différentes façons, mais j'ai peu ou aucune connaissance de C++ ou je ne sais rien sur DirectX

Merci pour votre temps de lecture et vos idées possibles. Edit: La meilleure solution serait une superposition similaire à celle de Steam/Xfire/Dolby Axon. Edit 2: Je n'ai pas eu de chance avec toutes les suggestions, donc j'ai fondamentalement rendu les bits transparents de mon image non transparents et laissé l'utilisateur décider lequel utiliser en fonction du logiciel de streaming qu'ils utiliseraient.

+1

Vous pourriez avoir plus de chance de poster sur http://gamedev.stackexchange.com/ – Rachel

+0

Merci, je vais essayer! – Citroenfris

+0

Quel logiciel de capture utilisez-vous pour créer le "flux"? FRAPS, Camtasia, etc? –

Répondre

0

Juste une idée, mais si vous le faites que presque transparente (par exemple alpha = 0,01 environ)? Ensuite, il devrait avoir assez de "substance" pour être capté par le streaming, mais être encore assez invisible pour ne pas déranger la vue.

+0

Le problème est le moment où je mets AllowsTransparency = "True", il ne montre pas sur le logiciel de streaming. Si je le mets à false il y a une bordure laide autour de l'image de la fenêtre qui n'est pas l'idée = [. Si je change l'opacité de la fenêtre, le problème est que tout dans cette fenêtre deviendra à peine visible. – Citroenfris

+0

Désolé, je n'ai plus d'idées. – TToni

+0

Merci quand même! – Citroenfris

0

Une possibilité est que l'alpha-blend se fasse totalement sur le GPU, empêchant le logiciel de streaming de le trouver. Vous pouvez donc essayer de forcer le rendu logiciel dans votre application WPF. Vous pouvez le faire en définissant:

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly

+0

Je crains que cela ne fonctionne pas non plus :(.Dès que mes fenêtres changent sur le thème de base (le logiciel de streaming le fait automatiquement), il disparaît, sinon il apparaît sur le flux. – Citroenfris

1

Puisque vous ne l'avez pas encore reçu de réponse Je pensais que je vous suggère une approche légèrement différente.

Faire un WinForm que vous réglez sur MdiParent. Ensuite, vous envoyez une commande Win32API pour placer le jeu dans votre application en tant que fenêtre enfant, supprimez les bordures, optimisez-le.

IntPtr Parent = hWnd of your main form. 
IntPtr hWnd = Win32.User.FindWindow(null, "TheGame"); 
Win32.User.SetParent(hWnd, Parent); 
// Get current window style of child form 
int style = Win32.User.GetWindowLong(hWnd, Win32.User.GWL_STYLE); 
// Take current window style and remove WS_CAPTION and WS_BORDER from it 
Win32.User.SetWindowLong(hWnd, Win32.User.GWL_STYLE, (style & ~Win32.User.WS_CAPTION & ~Win32.User.WS_BORDER)); 
// Maximize within parent 
Win32.User.ShowWindow(hWnd, Win32.User.SW_SHOWMAXIMIZED); 

Note: La classe Win32.User est juste une enveloppe de vanille pour les commandes Interop Win32 correspondantes.

Vous devriez maintenant pouvoir dessiner au-dessus de cette fenêtre soit par GDI + directement dans le hWnd, soit en plaçant quelque chose dessus.Le problème que vous rencontrez avec la transparence peut nécessiter de faire une copie manuelle, c'est-à-dire de rendre votre interface quelque part, puis de la copier pixel par pixel dans la fenêtre de destination en ignorant les pixels transparents. J'espère que ceci est utile ou au moins peut susciter quelques idées.

EDIT: Vous pouvez également trouver cela intéressant:
http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

L'exemple d'application vous permet de modifier l'image avant qu'elle ne soit affichée. Vous y ajoutez simplement des modules simples qui reçoivent des entrées et définissent des sorties. Bien trop lent à utiliser pour le vrai jeu cependant. :)

EDIT2: J'ai juste rencontré SetLayeredWindowAttributes. Je ne sais pas si cela fonctionne, mais vous pouvez utiliser cet appel (voir mon code ci-dessus sur trouver une fenêtre) pour définir la couleur de transparence.

1

J'ai eu un problème avec la transparence dans WPF. Lorsque vous mettez la transparence à zéro, il n'y a rien à ramasser. Réglez à la valeur minimale, puis le logiciel de streaming sera en mesure de le ramasser.