在没有窗口的windows桌面上绘制OpenGL

Posted

技术标签:

【中文标题】在没有窗口的windows桌面上绘制OpenGL【英文标题】:Draw OpenGL on the windows desktop without a window 【发布时间】:2010-05-29 14:49:03 【问题描述】:

我见过这样的事情,我想知道这是否可能,假设我运行我的应用程序 它会在它下面的任何地方显示渲染。

所以基本上,在没有窗口的情况下在屏幕上渲染。

可能还是谎言?

注意:希望在 windows 和 c++ 中执行此操作。

【问题讨论】:

我不明白你想对渲染输出做什么:你想在哪里显示它?相关:***.com/questions/3191978/… 【参考方案1】:

可以使用您的应用程序在其他应用程序的窗口上绘图。一旦你找到了你想要的窗口,你就有了它的 HWND,然后你就可以使用它,就像它是你自己的窗口一样用于绘图。但由于该窗口不知道您已完成此操作,因此当它尝试重绘自身时,它可能会弄乱您在其上绘制的任何内容。

有一些非常复杂的方法可以解决这个问题,其中一些涉及使用窗口“钩子”来拦截到该窗口的绘图消息,以便您知道它何时重绘,以便您也可以进行重绘。

另一种选择是在窗口上使用剪辑区域。这可以让您的窗口具有不同寻常的形状,并使其后面的所有内容看起来仍然正确。

还有一些方法可以接管桌面背景窗口的绘制,您实际上可以运行一个在桌面背景上绘制动画和内容的应用程序(当桌面仍然可用时)。至少,这在 XP 上是可能的,不确定它是否在 Vista/Win7 中有所改变。

不幸的是,所有这些选项都非常复杂,如果没有更多关于您正在尝试做什么的信息,无法深入了解。

【讨论】:

【参考方案2】:

您可以使用GetDesktopWindow(),获取桌面的HWND。但正如之前的答案所说(SoapBox),请小心,您可能会弄乱桌面,因为操作系统希望它拥有它。

【讨论】:

是的,使用它(正确地)很棘手,我的猜测是我可以光栅化每一帧,然后一直将其用作自定义形状的窗口,但这会变得相当慢。我以前使用 GDI 在桌面等上绘制 png,但是在其中获取动画有点棘手,但我会尝试使用 GDI 实现我的光栅化想法,将所有内容渲染为 png 并将其与 GDI 一起使用。当然感谢 SoapBox 和 gbrandt 的帮助。【参考方案3】:

几年前我写了一个开源项目来在桌面背景上实现这一点。它被称为 Uberdash。如果您遵循窗口层次结构,则桌面只是一种“背景”容器中的窗口。然后是主容器和前容器。前端容器是窗口变成全屏或“始终在顶部”的方式。您也许可以使用 Aero 组合在前端容器中渲染带有 alpha 的窗口,但您需要将事件传递到较低的窗口。不会很漂亮。

此外,某些视频卡中还有一种技术,称为覆盖层/底层。您曾经能够直接渲染到叠加层。您的 GPU 将直接应用它,而不会干扰主内存。因此,即使您进行了屏幕截图,您的叠加层/底层也不会出现在屏幕截图中。不幸的是,MS 在 Vista 中禁止了该技术...

【讨论】:

以上是关于在没有窗口的windows桌面上绘制OpenGL的主要内容,如果未能解决你的问题,请参考以下文章

VC 在桌面上绘制一些图形

有没有办法我可以一直在桌面上绘制一个透明的 WPF 应用程序?

Windows 10 中非活动桌面上的 PrintWindow

如何从python中的小部件在任何窗口上绘制

Windows 窗口样式 什么是 WS_EX_NOREDIRECTIONBITMAP 样式

Qt文档阅读Window and Dialog Widgets