C++直接绘制到屏幕上(类似于叠加层)

11
现在许多笔记本电脑都有FN热键来调节音量、亮度等,并通常显示一个视觉提示,完全覆盖在操作系统之上。对于新的Windows 8/8.1系统,这个视觉提示甚至出现在桌面外部的Metro侧栏中。它们不能绘制在无边界窗口内,否则它不会出现在Metro界面上。
我尝试研究DirectX是否可以直接绘制到屏幕上,但似乎不行。我甚至不知道是否应该研究OpenGL……?
我使用GDI有一些成功;具体来说,使用参数NULL的GetDC函数来获取屏幕设备。
#include <Windows.h>

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

然而,这需要不断重新渲染所有内容,因为我的屏幕区域可能被后台中的其他窗口覆盖。即使通过循环重新渲染,仍然存在大量的屏幕闪烁。

这些笔记本电脑的原始设备制造商是如何实现这一点的?

谢谢。


2
我会检查Shell功能。请注意,直接呈现到屏幕可能会产生许多视觉伪影(由于某些破碎的假设)。 - Cheers and hth. - Alf
尝试使用Windows Presentation Foundation (WPF)。它可用于绘制悬停在桌面或任何背景上的2D/3D图形。 - rashmatash
当然,Metro界面也使用窗口管理器作为其核心吧?如果您可以获取正确的窗口站/桌面句柄,我相信也可以在那里显示窗口。供应商的覆盖进程在哪个用户帐户下运行(系统帐户还是您自己的帐户)? - flodin
DirectX和OpenGL都无法帮助,因为在窗口模式下它们本质上使用的是GDI。使用GDI时,您可以在创建窗口时使用WS_EX_TOPMOST标志将其保持在所有其他窗口之上,但我不知道这是否适用于Windows 8以在Metro界面上绘制内容。 - Ross Ridge
CamStudio是如何录制桌面的?也许这就是你要找的机制? - axon
仔细研究一下扩展窗口创建选项,也许WS_EX_TRANSPARENT(无输入魔法!)的某种组合是你正在寻找的: https://dev59.com/UlfUa4cB1Zd3GeqPKK_L - John Bargman
1个回答

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接