使用全屏OpenGL应用程序时是否可以保持Windows的合成器正常工作?

Windows下,当DWM组合处于活动状态时,完全屏蔽的OpenGL应用程序有一些“特殊path” ,可以防止所有其他子窗口(popup窗口,菜单,工具提示)正确地分层在完全屏蔽的OpenGL窗口之上

虽然这对于游戏等是非常有用的,但对于其他全屏OpenGL应用程序(CAD,3D编辑器等)却是一件痛苦的事情。 这个问题给Qt用户造成了无尽的麻烦,请看这里 , 这里或者这里 。

有没有办法告诉Windows不要为给定的应用程序/全屏窗口启用特殊path? 无论是在清单中,还是通过DWM API,我都不在乎。

是的,这可以通过欺骗Windows认为窗口应该与透明度合成来完成。 为此,您可以在窗口上调用DwmEnableBlurBehindWindow 。 在全屏幕WS_POPUP窗口的情况下,这会使窗口完全透明(而不是玻璃效果),并且您可以使用窗口的Alpha通道来控制不透明度; 对于标题区域和边框的常规窗口,您可以获得玻璃效果。

现在,如果将像素格式配置为不使用Alpha通道,或者将Alpha通道设置为全1(完全不透明),则合成器仍然必须假定某些透明度可能存在,并且会经过全面组合。

小更新

尽管WinXP和Win2k超出了它们的EOL,但是将dwmapi.dll硬dwmapi.dll到可执行文件可能是不可取的,例如,如果由于某种原因必须使用软件来支持遗留系统。 为此,我编写了一个小型包装库dwm_load ,动态加载dwmapi.dll(如果可用)或退回到DWM功能的失败保护实现。