2010-12-07 9 views
16

GrüßeWPF - Transparenz - Stream Desktop Inhalt

Ich bin dabei, ein Scoreboard für ein Spiel (Starcraft II) zu machen. Diese Anzeigetafel wird als WPF-Anwendung mit einem C# -Code-Behind erstellt. Ich habe bereits eine Version, die zu 90% in WinForms funktioniert, aber mir fehlte die Unterstützung, um es einfach viel schöner aussehen zu lassen, die in WPF verfügbar sind.

Der Zweck dieser Anwendung wird es sein, eine Art Overlay über einem laufenden Spiel zu bilden. Dieses Spiel ist in Fulscreen (Windowed Mode), also wenn ich in WinForms habe ich es so codiert, dass es immer oben sein sollte. Es wäre so und das war kein Problem.

Da das Haupt-Aussehen der App in WPF auf einem Bild mit einem transparenten Hintergrund basiert, habe ich die meisten Hintergrundwerte auf Transparent gesetzt. Wenn ich dies tue, wird die gesamte Anwendung jedoch nicht von Streaming-Software registriert. Zum Beispiel zeigt es nur meinen Desktop oder das Spiel, das ich spiele, aber nicht meine Anwendung, obwohl es dort ist. Ich kann es mit meinen eigenen Augen sehen, aber das Publikum auf dem Strom kann nicht.

Hat jemand irgendwelche Erfahrung mit dieser Angelegenheit, weil es wirklich meinen Kopf in. Meine gesamte Anwendung wird nutzlos sein, wenn es nicht in Streams sichtbar ist. Wenn ich den Hintergrund eher auf eine Farbe als auf eine transparente setzen muss, wird das UI komplett demoliert.

Ich versuche grundsätzlich, ein Spiel-Overlay in C# & WPF zu machen. Ich habe gelesen, dass Sie dies auf verschiedene Arten tun können, aber ich habe wenig bis keine Kenntnisse von C++ noch weiß ich etwas über DirectX

Vielen Dank für Ihre Zeit zu lesen und Ihre möglichen Erkenntnisse.

Edit: Die beste Lösung wäre ein Overlay ähnlich dem von Steam/Xfire/Dolby Axon.

Edit 2: Ich hatte kein Glück mit all den Vorschlägen, so dass ich im Grunde die transparenten Bits meines Bildes nicht transparent und ließ den Benutzer entscheiden, welche zu verwenden, je nachdem welche Streaming-Software sie verwenden würde.

+1

Vielleicht haben Sie mehr Glück auf http://gamedev.stackexchange.com/ – Rachel

+0

Vielen Dank, ich werde es versuchen! – Citroenfris

+0

Welche Capture-Software verwenden Sie, um den "Stream" zu erstellen? FRAPS, Camtasia usw.? –

Antwort

0

Nur eine Idee, aber was ist, wenn Sie es nur fast transparent machen (d. H. Alpha = 0,01 oder so)? Dann sollte es genug "Substanz" haben, um vom Streaming aufgenommen zu werden, aber immer noch unsichtbar genug, um die Sicht nicht zu stören.

+0

Das Problem ist der Moment, in dem ich AllowsTransparency = "True" festlege, es wird auf der Streaming-Software nicht angezeigt. Wenn ich es auf false setze, gibt es einen hässlichen Rand um das Bild vom Fenster, was nicht die Idee = [ist. Wenn ich die Deckkraft des Fensters ändere, ist das Problem, dass alles in diesem Fenster kaum sichtbar wird. – Citroenfris

+0

Sorry, dann habe ich auch keine Ideen mehr. – TToni

+0

Danke trotzdem! – Citroenfris

0

Eine Möglichkeit ist, dass das Alpha-Blending vollständig auf der GPU ausgeführt wird, so dass die Streaming-Software es nicht finden kann. Sie könnten also versuchen, das Software-Rendering in Ihrer WPF-App zu erzwingen. Sie können das tun, indem Sie:

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly

+0

Ich fürchte, das funktioniert auch nicht :(.Sobald sich mein Windows auf das Basisthema ändert (Streaming-Software tut dies automatisch), verschwindet es, sonst wird es im Stream angezeigt. – Citroenfris

1

Da Sie keine Antwort erhalten haben, aber ich dachte, dass ich einen etwas anderen Ansatz vorschlagen würde.

Erstellen Sie ein WinForm, das Sie auf MDIParent festlegen. Dann senden Sie einen Win32API-Befehl, um das Spiel als untergeordnetes Fenster in Ihre Anwendung zu bringen, die Grenzen zu entfernen, zu maximieren.

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); 

Hinweis: Die Win32.User Klasse ist nur ein Vanille-Wrapper für die entsprechenden Win32 Interop-Befehle.

Sie sollten jetzt in der Lage sein, über dieses Fenster zu zeichnen, indem Sie entweder direkt auf die HWD klicken oder etwas darüber legen.Das Problem, das Sie mit der Transparenz haben, erfordert möglicherweise ein manuelles Kopieren, das heißt, Sie rendern Ihre Schnittstelle irgendwo und kopieren sie dann Pixel für Pixel in das Zielfenster und überspringen dabei alle transparenten Pixel.

Ich hoffe, dass dies nützlich ist oder zumindest einige Ideen auslösen kann.

EDIT: Auch interessant das Sie finden können:
http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

Das Beispiel-App ermöglicht es Ihnen, das Bild zu ändern, bevor es angezeigt wird. Sie fügen einfach einfache Module hinzu, die Eingaben erhalten und die Ausgabe festlegen. Viel zu langsam für echtes Spiel. :)

EDIT2: kam gerade über SetLayeredWindowAttributes. Nicht sicher, ob es funktioniert, aber Sie können diesen Aufruf verwenden (siehe meinen Code oben im Suchfenster), um die Transparenzfarbe festzulegen.

1

Ich hatte ein Problem mit Transparenz in WPF. Wenn Sie Transparenz auf Null setzen, hat sie nichts aufzuheben. Stellen Sie den minimalen Wert ein, und die Streaming-Software kann sie dann aufnehmen.