Preface前端
话说,在用暴风影音进行视频播放的时候,利用其它的软件对视频进行截图的时候,并不能截取到视频的画面,我这里用QQ五笔的截图功能截图,效果以下ide
对于这种状况,之前也常常赶上,可是也没有想过为何?
函数
能够看见,黑屏的只是视频播放界面,而播放列表与边框均可以显示!spa
而后我就在群里问了一下。视频
有的说是暴风置顶了吧,这个我首先就排除了,即便是置顶了,也能够截到图。htm
小菜说是Paint重绘,截图好像和重绘没什么关系吧。blog
另外从技术角度上看看,听说暴风是VB编写的,视频渲染用的是微软的程序接口,就是基于directx的,而后查了下directx的资料,根据百度百科的资料http://baike.baidu.com/view/15762.htm,看看directx显示的原理接口
directx显示原理get
一般咱们看到的屏幕上的数据,都是经过Primary Surface送至显示器的,什么是Primary Surface呢?中文叫作主显示表面,也就是说咱们当前看到的屏幕上的图像数据是从这个表面来的,除了主表面外还有离屏表面,叫作OffScreenSuface。这种表面中的数据是不直接显示在屏幕上的。it
如今多数的视频播放软件都是用DDraw写的(加速),并且使用了一种叫作Overlay的表面。
那什么是Overlay呢?
根据微软官方:http://msdn.microsoft.com/en-us/library/aa916217.aspx,Overlay是纯硬件支持的,DDraw并不会用软件实现这种功能。这种Surface的特殊之处在于,它至关于蒙在屏幕上的一块塑料板,也就是说,这个若是使用了这种Surface,那么它就位于全部surface的最前端。显示设备在向屏幕显示数据的时候,会先判断该位置是否有Overlay,若是有,就显示Overlay中像素,若是没有,就使用Primary Surface中的像素。
好了,咱们如今知道,暴风也是采用了DDraw写的,并且使用了一种叫作Overlay的表面来加速,而且这种表面是纯硬件支持的,位于全部surface的最前端。
软件截图
可是暴风软件自带的截图功能就能够截图,那截图黑屏就还有截图软件的缘由了。
由上面Overlay的分析知道,它是位于全部surface的最前端,而咱们看到的屏幕上的数据,都是经过Primary Surface送至显示器的,会不会是Overlay把Primary Surface给挡住了,因此软件截不到图?
如题,咱们经常使用的截屏函数都是截取普通的primary surface中的数据,没法截取Overlay surface中的数据,而微软又没有提供公共的API来获取Overlay surface中的数据,因此,当咱们打开一个播放器来播放视频,截图的时候发现播放器窗口是黑的。缘由就是这块区域正好对应着Overlay,而后固然就是截取不到的了,黑屏就不足为奇了。
终上所述:黑屏是因为DDraw加速引发的!
解决截图黑屏
既然Overlay是纯硬件支持的,那么咱们是否是能够关掉DDraw加速呢?答案是能够的。
大多数软件除了DDraw的渲染模式以外,还提供了一种Software renderer模式,也就是软件模式,这种模式在DDraw加速不可用的时候才会使用,因此一个避免截图黑屏的办法就是关闭DDraw加速,强迫软件使用Software renderer模式,这样,Overlay surface就不存在了,也就不会黑屏了。
咱们在DirectX的控制面板能够关闭DDraw加速,若是安装了DirectX SDK,那么直接在运行栏里面输入dxdiag便可打开DirectX控制面板
这个方法是关掉了系统的DDraw加速,因此系统中全部其余软件也不能使用DDraw加速了。固然使用软件自己的设置关掉加速也能够,而后即可以截图了。
获取Overlay中的数据?
听说使用Hook技术可能会办到,可是这个技术,向来是被杀软列入黑名单的,搞出来也得不偿失,有兴趣的童鞋去关注吧。。。
小结
在查阅资料以前,我对这个也是一点也不懂,而后经过各类百度谷歌微软+实践,对这个东西的原理也算是了解了。
因此,生活中处处都是知识,关键是须要一双发现知识的眼睛,而后验证它,突破它,创新它,最后代替它,哈哈