有谁记得 Windows XP 媒体播放器 截图的特殊现象

2023-06-27 10:26:22 +08:00
 mikewang

昨天防截图的主题 /t/951728,让我想起了很多年前 Windows XP 中对 Windows Media Player 截屏的神奇现象:

  1. 播放视频时按下键盘 PrintScreen 截屏,粘贴到画图工具保存为 BMP 文件。打开图片文件,发现播放器内是黑的,看不到视频。

  2. 打开 Windows Media Player ,播放另一个视频;接着打开截图 BMP 文件,发现截图里的 “Windows Media Player” 正在播放后方播放器一模一样的内容,仿佛截屏会动了。

  3. 截屏里的黑色好像和真正的黑色不一样,截屏播放器的黑色可以透过窗口播放后方视频,而用画图板在截屏的基础上画上一个黑色矩形,那么在播放的视频上真的就产生了一个不透明的黑色遮罩。

我只记得当时这么一个现象,给了年幼的我很大震撼,让我一度以为是什么黑魔法(卧槽,BMP 图片会动了)

不过如今回想起来,还是不大能理解:BMP 应该是一系列 RGB 的组合吧,有什么 RGB 值是能够透过窗口播放视频的呢?

现在我没有 Windows XP 系统了,还请各位大神帮忙解惑。

2862 次点击
所在节点    Windows
21 条回复
ooool
2023-06-28 13:53:53 +08:00
这个是 Multiplane overlay
https://learn.microsoft.com/en-us/windows-hardware/drivers/display/multiplane-overlay-support
视频播放这块区域,不是程序用 D3D DrawIndexed 直接画在最外层的交换链上,
而是一个单独的交换链区域,相当于子窗口一样,那块区域本质上没有任何像素,IDXGIFactory2::CreateSwapChainForComposition,CreateSwapChainForCoreWindow
如果你 HOOK dwm 截图,开启了 MPO 之后回来这个函数 IDXGISwapChainDWM1::PresentMultiplaneOverlay ,
这里面的 ID3D11Texture2D 也和你说的一样,是没有视频播放区域的,看起来都是黑色的,
除非你的交换链不是 DXGI_SWAP_EFFECT_FLIP_XXX 形式创建的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Dwm, create DWORD OverlayTestMode with value 00000005.
可以通过修改注册表关闭 MPO 这样就不会出现这种情况
如果你想截图到这些东西,可以 HOOK IDXGISwapChainDWM1::CheckMultiplaneOverlaySupport 直接返回 E_FAIL
这个函数绘制的时候,会实时监测窗口遮挡覆盖之类的东西,是否走 IDXGISwapChainDWM1::PresentDWM 分支
IDXGISwapChainDWM1::PresentDWM 截图出来的图,就是好的,UAC 之类的框也能截到
不管你反截图还是防录播,都可以截图到,以后系统更新好不好使就不知道了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/951977

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX