在Windows桌面上绘制OpenGL而无需窗口

6

我看到过类似这样的东西,想知道是否可能,比如说我运行我的应用程序并且它会在下面显示渲染结果。

所以基本上是在屏幕上进行渲染而没有窗口。

这个可能吗?还是说是谎言?

注:希望在Windows和C++中实现。


我不明白你想要如何处理渲染输出:你想在哪里显示它?相关链接:https://dev59.com/gnA75IYBdhLWcg3wo6le - Ciro Santilli OurBigBook.com
3个回答

4
可以使用您的应用程序在其他应用程序的窗口上绘图。一旦找到所需的窗口,您就拥有了它的HWND,然后可以像自己的窗口一样用于绘图。但是由于该窗口不知道您已经这样做,当它尝试重新绘制时,它可能会破坏您绘制的任何内容。
有一些非常复杂的方法可以解决这个问题,其中一些涉及使用Windows“钩子”来拦截对该窗口的绘图消息,以便您知道何时重新绘制,以便您也可以进行重新绘制。
另一个选项是在窗口上使用剪辑区域。这可以使您的窗口具有不寻常的形状,并且所有背景仍然看起来正确。
还有一种方法是接管桌面背景窗口的绘图,您实际上可以运行一个应用程序,在桌面背景上绘制动画等内容(同时桌面仍然可用)。至少在XP中是可能的,不确定在Vista / Win7中是否有所改变。
不幸的是,所有这些选项都太过复杂,如果没有更多关于您要完成的任务的信息,很难深入研究。

1
你可以使用GetDesktopWindow()来获取桌面的HWND。但是正如之前的回答所说(SoapBox),要小心,因为你可能会搞乱桌面,因为操作系统期望它拥有桌面。

是的,与它(适当地)一起工作很棘手,我猜想我可以将每个帧光栅化,然后将其用作自定义形状窗口,但这会变得相当缓慢。我以前使用过GDI在桌面上绘制png等,但在其中添加动画有点棘手,但我将尝试使用GDI进行光栅化想法,将所有内容渲染到png中,并使用GDI进行操作。感谢SoapBox和gbrandt的帮助。 - Yonathan

0

我几年前写了一个开源项目,用于在桌面背景上实现这个功能。它被称为Uberdash。如果您遵循窗口层次结构,桌面只是一个位于某种“背景”容器中的窗口。然后有一个主容器和一个前置容器。前置容器是窗口变成全屏或“始终置顶”的方式。您可以尝试使用Aero合成将具有alpha的窗口呈现在前置容器中,但是您需要将事件传递给较低的窗口。它看起来不太好。

另外,一些显卡技术中有一个称为覆盖/下层的技术。您曾经可以直接渲染到覆盖层,您的GPU会直接应用它,而不会干扰主存储器。因此,即使您进行屏幕截图,您的覆盖/下层也不会出现在屏幕截图中。不幸的是,MS在Vista中禁止了这项技术......


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接