检测窗口是不是正在使用硬件加速的图形上下文

Posted

技术标签:

【中文标题】检测窗口是不是正在使用硬件加速的图形上下文【英文标题】:Detect if a window is using hardware-accelerated graphic context检测窗口是否正在使用硬件加速的图形上下文 【发布时间】:2019-10-16 14:59:05 【问题描述】:

我正在使用BitBlt winapi 函数对给定窗口进行截图,即使窗口部分重叠。 我已经一切正常,除了在 Windows 10 上,对于某些窗口(如 Edge 浏览器),屏幕截图完全变黑。

许多其他问题都同意将此问题归因于在这些窗口上使用硬件加速图形上下文。

BitBlt screen capture not working on Windows 10 Screenshot with BitBlt results in black image on Windows 10 Screenshot captured using BitBlt in C# results a black image on Windows 10 BitBlt not capturing windows in Hardware accelerated mode AutoHotkey-GDIp: Capture a screenshot from a hardware accelerated window

显然 GDI 库与那种图形上下文不兼容,因此必须使用不同的库。

我的问题具体是关于如何检测窗口是否使用与 GDI 库不兼容的图形上下文

如果我能够检测到这一点,那么我可以选择使用哪个库来正确捕获屏幕截图(GDI、ActiveX 或其他)。

否则,我能检测到这一点的唯一方法是逐个像素地扫描屏幕截图以检查它是否完全是黑色的。然后使用不同的捕获方法,直到我在屏幕截图上获得一些内容。 但这听起来像是一个糟糕的解决方案。

【问题讨论】:

GetDC(nullptr)截取你的截图,然后剪掉目标窗口。 @JonathanPotter,不幸的是,该技术不适用于部分重叠的窗口。 在任何情况下都不能使用 BitBlt 捕获重叠的窗口。 "对于某些窗口...屏幕截图完全变黑" - 硬件加速不是可能发生的唯一原因。在 Windows 7+ 中,应用程序可以简单地 choose to opt-out 将其窗口呈现在实际显示监视器之外的任何位置(例如考虑 DRM 保护)。 @JonathanPotter,是的,你可以。自从在 Windows Vista 中引入 DWM 组合以来,这已经成为可能。 【参考方案1】:

我已经一切正常,除了在 Windows 10 上, 对于某些窗口(如 Edge 浏览器),屏幕截图会显示 全黑。

您可以使用DwmRegisterThumbnail 捕获隐藏/重叠的窗口,特别是 UWP(如 Edge、Calc 等)

我在 Windows 10 上使用它没有问题(+ D3D 保存位图)

【讨论】:

我以为DwmRegisterThumbnail 可以让您在自己的窗口中显示缩略图,但它无法让您访问像素数据。调用DwmUpdateThumbnailProperties后如何获取图片数据? 我使用 D3DXSaveSurfaceToFile 进行了测试(VS 2015,Windows 10)

以上是关于检测窗口是不是正在使用硬件加速的图形上下文的主要内容,如果未能解决你的问题,请参考以下文章

beaglebone black 是不是支持 gpu 硬件加速?

如何使用 Play 商店和硬件加速创建虚拟设备?

html5硬件中的canvas元素是不是加速?

Win32:是不是有使用硬件加速的替代 GDI32.dll?

wpfitemscontrolimage内存占用

ffmpeg 的硬件加速不起作用