DirectX截图黑屏的解决办法

简介: 好久没有更新博客了,今天开始继续耕耘。 生活要继续 工作要继续 梦想也一定要继续! 之前写过一篇关于DirectX截屏的文章,其中有网友留言提到了截图黑屏的问题,于是这些日子研究了一下,与大家一同分享。

好久没有更新博客了,今天开始继续耕耘。

生活要继续

工作要继续

梦想也一定要继续!

之前写过一篇关于DirectX截屏的文章,其中有网友留言提到了截图黑屏的问题,于是这些日子研究了一下,与大家一同分享。

为什么会黑屏?

一句话概括,黑屏是由于DDraw加速引起的!

先说一下DirectX的显示原理,通常我们看到的屏幕上的数据,都是通过Primary Surface送至显示器的,什么是Primary Surface呢?中文叫做主显示表面,也就是说我们当前看到的屏幕上的图像数据是从这个表面来的,除了主表面意外还有离屏表面,叫做OffScreenSuface。这种表面中的数据是不直接显示在屏幕上的。常用的截屏函数也基本上是通过截取Primary Surface中的数据来实现的。现在多数的视频播放软件都是用DDraw写的(现在DDraw已经融合到DirectX的Graphics本分,DDraw这个词也已经成为历史了。),而且使用了一种叫做Overlay的表面,我们常用的截屏函数都是截取普通的primary surface中的数据,无法截取Overlay surface中的数据,而微软又没有提供公共的API来获取Overlay surface中的数据,所以,黑屏就不足为奇了。下面就是使用了Overlay技术的Windows Media Player截图时的黑屏现象。

Overlay是纯硬件支持的,DDraw并不会用软件实现这种功能。这种Surface的特殊之处在于,它相当于蒙在屏幕上的一块塑料板,也就是说,这个如果使用了这种Surface,那么它就位于所有surface的最前端。显示设备在向屏幕显示数据的时候,会先判断该位置是否有Overlay,如果有,就显示Overlay中像素,如果没有,就使用Primary Surface中的像素。所以,当你打开一个播放器来播放视频,截图的时候就会发现播放器窗口是黑的。原因就是这块区域正好对应着Overlay。当然是截取不到的。

关于Overlay surfaces的详细介绍,可以看这里

如何避免截图时黑屏

大多数软件除了DDraw的渲染模式之外,还提供了一种Software renderer模式,也就是软件模式,这种模式在DDraw加速不可用的时候才会使用,所以一个避免截图黑屏的办法就是关闭DDraw加速,强迫软件使用Software renderer模式,这样,Overlay surface就不存在了,也就不会黑屏了。具体办法如下

方法一: 使用软件本身的设置来禁用Overlay技术,该方法只会影响该软件本身,以常见的Windows Media Player为例,设置如下(将 使用覆盖这个选项勾掉,这样软件就不会使用Overlay Surface了)

方法二: 使用DirectX控制面板来关闭DDraw加速,上面的方法相当于关闭分支开关,而这个方法则相当于把总闸给关闭了,系统中所有其他软件也不能使用DDraw加速了。如果安装了DirectX SDK,那么直接在运行栏里面输入dxdiag即可打开DirectX控制面板,设置如下。

方法三:其实还有一种办法,就是用程序占用Overlay surface,这种办法太麻烦,一般人不会用,因为一般的独立显卡都支持Overlay Surface,而且支持的个数是有限的,所以,如果我们提前用程序占用了所有的Overlay Surface,那么其他程序就无法再使用了,也就不会导致截图黑屏了。在使用这种方法前,应该首先查看自己的显卡是否支持Overlay技术,以及支持多少个。如果安装了DirectX SDK,可以依次展开:开始-程序-Microsoft DirectX SDK-DirectX Utilities-DirectX Caps Viewer,由下图可知,我的显卡支持一个Overlay Surface,我还没玩过高级显卡,没见过支持多个Overlay的显卡,哪位兄弟有好的显卡,也发个图让小弟看看。

但是这种方法有一个弊端,就是如果软件不支持Software Renderer模式,那么如果你先用程序占用了Overlay,再启动播放软件的时候,就会导致错误。

以上几种办法究其本质,实际上就是一种,都是禁止使用Overlay Surface。而且这些方法都有一个弊端,就是要求先入为主,也就是在软件启动前(或者确切的说,是视频播放前)做好设置,然后再启动软件。如果视频已经播放(Overlay已经被占用),那么这些方法将会统统失效。

除此之外,还可以使用现成的截图软件,很多软件都可以处理黑屏的情况,比如HyperSnap 6就很不错。

如何截取Overlay中的数据?

说来这不是一个简单的问题,我在网上搜索了很久,也没找到合适的办法,据说使用Hook技术可能会办到,但是我对hook不太熟悉,所以也没尝试,希望哪位朋友有兴趣可以试试,关于这个话题,google讨论组上有个帖子,介绍的比较详细,感兴趣的可以看看这里

挑战一下!

我这里有一个关于Overlay Surface的Demo(下载)。这个Demo来自DirectX 7的SDK,是一只飞动的小蚊子。由于版本较老,现在网上已经不太常见了。根据上面的研究可以断定,能截取到这只小蚊子绝非易事,感兴趣的朋友不妨试试!

References

Hardware Overlay 

 

from:http://www.cnblogs.com/graphics/archive/2012/04/03/2117798.html

目录
相关文章
【ChatGLM】本地版ChatGPT ?6G显存即可轻松使用 !ChatGLM-6B 清华开源模型本地部署教程
【ChatGLM】本地版ChatGPT ?6G显存即可轻松使用 !ChatGLM-6B 清华开源模型本地部署教程
1177 0
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
470 15
|
7月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
移动开发 前端开发 JavaScript
HTML5 Canvas鼠标与键盘事件
HTML5 Canvas鼠标与键盘事件
272 5
|
10月前
|
存储 调度
微信自动评论朋友圈,微信朋友圈自动发布工具,定时发朋友圈脚本
这个实现包含完整的微信朋友圈自动发布功能,支持定时发布、多图发布、任务持久化存储等功能
|
安全 算法 数据安全/隐私保护
汇编语言在当代计算领域的重要性:深入探讨其持续价值与实际应用
【8月更文挑战第31天】汇编语言虽看似古老,但在当今计算领域仍具不可替代的价值,是计算机科学的基石和高性能应用的核心。本文通过游戏开发、安全加密及操作系统内核开发等案例,展示了汇编语言在性能优化、硬件交互与增强安全性方面的独特优势。尽管现代编程语言抽象层次更高,但掌握汇编语言对深入理解计算机工作原理和追求极致性能仍至关重要。
618 0
|
机器学习/深度学习 TensorFlow 调度
使用Python实现深度学习模型:智能能源消耗预测与管理
使用Python实现深度学习模型:智能能源消耗预测与管理
831 30
|
移动开发 JavaScript 安全
js的常见的三种密码加密方式-MD5加密、Base64加密和解密和sha1加密详解总结
js的常见的三种密码加密方式-MD5加密、Base64加密和解密和sha1加密详解总结
971 0
|
JavaScript 前端开发 API
你真的理解事件绑定、事件冒泡和事件委托吗?
该文章详细解释了JavaScript中的事件绑定机制、事件冒泡行为以及事件委托技术,并通过实例帮助读者更好地理解和应用这些概念。
|
机器学习/深度学习 人工智能 自然语言处理
【AI 现况分析】AI 在后端开发领域的应用
【1月更文挑战第26天】【AI 现况分析】AI 在后端开发领域的应用