C#

问候

我正在为游戏制作记分牌(Starcraft II)。 这个记分牌是作为一个WPF应用程序与C#代码隐藏。 我已经有一个在WinForms中可以使用90%的版本,但是我缺乏支持,很容易使它看起来更好,这在WPF中可用。

这个应用程序的重点将是在正在运行的游戏之上形成一种叠加。 这个游戏是在Fulscreen(窗口模式)中,所以当我在WinForms中对它进行编码时,它应该始终位于顶端。 它会这样做,这是没有问题的。

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

有没有人有任何这方面的经验,因为它真的在做我的头。我的整个应用程序将无用,如果它不可见流。 如果我必须将背景放在一个颜色上而不是透明的话,UI的外观也会完全被拆除。

我基本上试图在C#和WPF中制作游戏覆盖。 我已经阅读过,你可以用不同的方式做到这一点,但我对C ++知之甚少,也不了解DirectX的任何内容

感谢您的阅读时间和您的可能见解。

编辑:最好的解决方案将是一个类似于Steam / Xfire /杜比核擎的叠加层。

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


既然你还没有收到任何回应,我想我会建议一个稍微不同的方法。

制作一个您设置为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互操作命令的香草包装。

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

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

编辑:你也可能会发现这个有趣的:
http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

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

编辑2:刚刚遇到SetLayeredWindowAttributes。 不知道它是否工作,但您可以使用此调用(请参阅上面的查找窗口中的代码)设置透明度颜色。


我在WPF的透明度方面遇到了一些问题。 当你将透明度设置为零时,它没有任何东西可以拾取。 设置为最小值,然后流式处理软件将能够提取它。


只是一个想法,但如果你只是几乎透明(即α= 0.01左右)呢? 然后,它应该有足够的“实质”被流媒体采集,但仍然是不可见的,不会打扰视图。

链接地址: http://www.djcxy.com/p/25905.html

上一篇: c#

下一篇: WPF Window transparency while hosting a Flash ActiveX component