C++ 直接在屏幕上绘图(如覆盖)

Posted

技术标签:

【中文标题】C++ 直接在屏幕上绘图(如覆盖)【英文标题】:C++ Drawing directly to the screen (like an overlay) 【发布时间】: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 如何录制桌面?也许有你的机制? 【参考方案1】:

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

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

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

【讨论】:

以上是关于C++ 直接在屏幕上绘图(如覆盖)的主要内容,如果未能解决你的问题,请参考以下文章

GDI双缓冲绘图

如何直接写到屏幕上?

C++经典绘图工具EasyX

检测到屏幕覆盖 - 如何在屏幕覆盖应用程序中处理此问题

如何从python中的小部件在任何窗口上绘制

如何在 C# 中有效地在桌面上绘图?