在沉浸式全屏模式之上的透明窗口

kli*_*klk 2 c++ windows winapi gdi

我正试图在沉浸式全屏模式下绘制另一个进程.我知道这可以使用GDI,我有两个问题:

  1. 是否可以使用顶级透明窗口?(在沉浸式过程之上)
  2. 是否有更高级别的API女巫我可以使用而不是GDI?

谢谢 :)

Com*_*sMS 7

在Windows中,您有两种创建全屏窗口的可能性:

  1. 具有显示器独占绘图权限的全屏应用程序.
  2. 无边框窗口,可扩展到完整的桌面分辨率.

第一个选项允许您更改分辨率,位深度和刷新率等显示属性,而第二个选项必须在此处使用与普通(窗口)桌面应用程序相同的选项.

只有在使用选项2实现全屏应用程序时,才能使用顶级窗口覆盖全屏窗口.但是,在这种情况下,任何能够创建透明顶级窗口的代码都可以(无论是纯WinAPI/GDI)或者更复杂的东西,比如Qt).

对于选项1,如说明所示,全屏应用程序具有对显示器的独占绘图权限.尝试在其前面放置另一个窗口将最小化全屏应用程序或强制它进入窗口模式.

在这种情况下,你有一些黑客如何仍然可以获得叠加,但它们是非常具有侵略性的.例如,使用基于D3D的全屏应用程序,您可以挂钩到D3D的Present例程,并让D3D在显示后台缓冲区之前绘制叠加层.这里重要的一点是,绘制叠加层的代码是在全屏应用程序的过程中执行的,因为这是唯一允许在该点绘制到屏幕的过程.

请注意,如果您以这种方式将代码注入流程,某些应用程序(特别是受反作弊软件保护的视频游戏)不太喜欢它.

请注意,Win API还为所谓的硬件覆盖提供了一个接口,允许在独占的全屏应用程序之上绘图.遗憾的是,这种机制在消费者硬件上并没有得到广泛支持,并且可能无法运行,具体取决于您尝试运行它的图形卡.