【问题标题】:C++ Drawing directly to the screen (like an overlay)C++ 直接在屏幕上绘图(如覆盖)
【发布时间】:2014-09-21 09:40:08
【问题描述】:

现在的许多笔记本电脑都有 FN 热键来改变音量、亮度等,并且通常会显示一个视觉提示,该提示完全呈现在操作系统上方的屏幕上。对于新的 Windows 8/8.1 系统,这种视觉效果甚至出现在 Metro 端的桌面之外。他们不能在无边框窗口内绘图,否则它不会显示在 Metro 界面上。

我曾尝试研究 DirectX 是否可以直接绘制到屏幕上,但似乎不能。我什至不知道我是否应该研究 OpenGL...?

我使用 GDI 取得了一些的成功;特别是GetDC函数,参数为NULL来抓取屏幕设备。

#include <Windows.h>

int main() {
    const HDC dc = GetDC(NULL);
    while (1) {
        Rectangle(dc, 100, 100, 500, 500);
    }
}

但是,这需要重复重新渲染所有内容,因为我的屏幕区域可能会被其他在后台更改的窗口覆盖。即使在循环中重新渲染,也会有大量的屏幕闪烁。

这些笔记本电脑的 OEM 制造商如何做到这一点?

谢谢。

【问题讨论】:

  • 我会检查 shell 功能。请注意,直接渲染到屏幕会产生大量视觉伪影(由于一些错误的假设)。
  • 试用 Windows Presentation Foundation (WPF)。它可用于绘制悬停在桌面或任何背景上的 2D/3D 图形。
  • Metro 界面肯定也使用窗口管理器作为其核心吗?如果你能抓住正确的窗口站/桌面手柄,我相信在那里也可以显示窗口。供应商的覆盖进程在哪个用户帐户下运行(系统帐户或您自己的)?
  • DirectX 和 OpenGL 无济于事,因为在窗口模式下它们本质上是在使用 GDI。使用 GDI,您可以在创建窗口时使用 WS_EX_TOPMOST 标志将其置于所有其他窗口之上,但我不知道这是否适用于 Windows 8 以在 Metro 界面上绘制内容。
  • linkCamStudio 如何录制桌面?也许有你的机制?

标签: c++ windows directx gdi+ gdi


【解决方案1】:

看起来这些是无边框窗口。 例如,看看任务切换器窗口:

相关问题: Windows 8 Layered Windows Over Metro Apps

如果您想要在 Metro 之上的窗口,您需要它来声明可访问性。

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2014-01-18
    相关资源
    最近更新 更多