【问题标题】:Transparent window on top of immersive full-screen mode沉浸式全屏模式之上的透明窗口
【发布时间】:2014-09-01 08:04:30
【问题描述】:

我正试图在另一个进程处于沉浸式全屏模式时对其进行绘制。 我知道使用 GDI 可以做到这一点,我有 2 个问题:

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

谢谢你:)

【问题讨论】:

    标签: c++ windows winapi gdi


    【解决方案1】:

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

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

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

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

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

    在这种情况下,您仍然可以使用一些技巧来获得覆盖,但它们相当具有侵入性。例如,使用基于 D3D 的全屏应用程序,您可以连接到 D3D 的Present 例程,并让 D3D 在显示后台缓冲区之前绘制您的叠加层。这里重要的一点是,用于绘制覆盖的代码是在全屏应用程序的进程中执行的,因为那是当时唯一允许在屏幕上绘制的进程。

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

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

    【讨论】:

    • 谢谢 :) 那么如果可以使用 GDI(GetWindowDC,Rectangle ext)在窗口上绘制,我可以确定窗口是使用选项 1 实现的吗?
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2014-03-06
    • 2013-12-23
    • 1970-01-01
    • 2018-12-30
    • 2021-05-31
    相关资源
    最近更新 更多