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

时间:2014-09-01 08:04:31

标签: c++ windows winapi gdi

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

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

1 个答案:

答案 0 :(得分:7)

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

  1. 具有显示器独家绘图权的全屏应用程序。
  2. 无边界窗口,可扩展至完整桌面分辨率。
  3. 第一个选项允许您更改分辨率,位深度和刷新率等显示属性,而第二个选项在此处使用与普通(窗口化)桌面应用程序相同的选项。

    如果使用选项2实现全屏应用程序,则使用顶级窗口覆盖全屏窗口。但是,在这种情况下,任何能够创建透明顶级的代码窗口会做(无论是纯粹的WinAPI / GDI,还是更复杂的东西,比如Qt)。

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

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

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

    请注意,Win API还为所谓的hardware overlays提供了一个界面,允许在独有的全屏应用程序之上绘图。不幸的是,这种机制在消费者硬件上并没有得到广泛支持,并且可能无法运行,具体取决于您尝试运行它的显卡。