【发布时间】: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