WPF - 透明度 - 流桌面内容

时间:2010-12-07 13:53:44

标签: c# wpf streaming transparency

问候

我正在为游戏制作记分牌(星际争霸II)。此记分板是作为具有C#代码隐藏的WPF应用程序制作的。我已经拥有一个在WinForms中可以使用90%的版本,但我缺乏支持,可以轻松地让它看起来更好用于WPF。

此应用程序的目的是在正在运行的游戏之上形成一种叠加层。这个游戏是在Fulscreen(窗口模式),所以在WinForms中我编写它,以便它应该始终在顶部。它会这样做,这没问题。

由于WPF中应用程序的主要外观基于具有透明背景的图像,因此我将大多数背景值设置为透明。但是,当我这样做时,整个应用程序都没有通过流媒体软件注册。例如,它只是显示我的桌面或我正在玩的游戏,但不是我的应用程序,即使它在那里。我可以亲眼看到它,但流上的观众不能。

有没有人对此事有任何经验,因为它确实是我的头脑。如果它在流上不可见,我的整个应用程序将毫无用处。如果我必须将背景放在一个颜色而不是透明的上,UI就会在外观方面完全被拆除。

我基本上试图在C#和# WPF。我已经读过你可以用不同的方式做到这一点但我对C ++几乎一无所知,也对DirectX一无所知

感谢您抽出时间阅读以及您可能获得的见解。

编辑:最佳解决方案是覆盖类似于Steam / Xfire / Dolby Axon的覆盖。

编辑2:我对所有建议都没有运气,所以我基本上使我的图像的透明位不透明,让用户根据他们将使用的流媒体软件决定使用哪一个。

4 个答案:

答案 0 :(得分:1)

由于您尚未收到任何回复,我认为我建议采用略有不同的方法。

创建一个设置为MDIParent的WinForm。然后发送Win32API命令将游戏作为子窗口放入应用程序,删除边框,最大化它。

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

注意:Win32.User类只是相应Win32互操作命令的一个vanilla包装器。

你现在应该可以通过GDI +直接在hWnd上绘制或在顶部放置一些东西来绘制这个窗口的顶部。您在透明度方面遇到的问题可能需要您进行一些手动复制,即在某处渲染界面,然后将其逐像素复制到目标窗口,跳过任何透明像素。

我希望这很有用,或者至少可以引发一些想法。

修改 您也可能会觉得这很有趣:
http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

示例应用程序允许您在显示之前修改图像。您只需向其中添加简单模块即可获取输入并设置输出。虽然使用真正的游戏太慢了。 :)

EDIT2:刚遇到SetLayeredWindowAttributes。不确定它是否有效,但您可以使用此调用(请参阅上面的代码查找窗口)来设置透明度颜色。

答案 1 :(得分:1)

我在WPF中遇到透明度问题。将透明度设置为零时,它没有任何东西可以拾取。设置为最小值,然后流媒体软件将能够获取它。

答案 2 :(得分:0)

只是一个想法,但是如果你使它几乎透明(即alpha = 0.01左右)怎么办?然后它应该有足够的“物质”被流媒体拾取,但仍然是不可见的,不会打扰视图。

答案 3 :(得分:0)

一种可能性是,alpha混合完全在GPU上完成,阻止了流媒体软件找到它。因此,您可以尝试在WPF应用程序中强制进行软件渲染。您可以通过设置:

来实现

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly