职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1054|回复: 1

屏幕监控 mirror?

[复制链接]
莲子 发表于 2009-8-18 11:58 | 显示全部楼层 |阅读模式
我自己正在做一个网络中的屏幕监控软件
我用GDI截图
然后发过去
不过这样图片都很大
150多k
再加上网速不行
一秒钟也就发过去1
2张图片
跟幻灯片一样
请问有什么好办法??》

QQ的屏幕监控是什么原理?
我从网上看有个Mirror的驱动
只截取变化部分
能不能给个思路?

谢谢了~~高分送上
问题补充:
请各位最好说说自己的见解
或是给一些自己的关键代码
网上的文章我都已经看过N遍了
它只是说的原理
而没有说具体编程如何做
谢谢
cheng9525 发表于 2009-8-18 11:58 | 显示全部楼层

屏幕监控 mirror?

计算机屏幕图像的截取在屏幕的录制、计算机远程控制以及多媒体教学软件中都是关键术
基于Windows操作系统有多种截屏方法
研究的重点集中在如何快速有效的截取DBI(Device-Independent Bitmap)格式的屏幕图形数据
现在商业软件流行的截屏技术主要采取的Api Hook技术
但这种技术一次截屏仍有较大的时间消耗
这样就对运行软件的硬件仍有较多的限制
而且是一种非标准的技术
不为微软公司所推荐

1截屏技术

1.1使用api hook技术

使用api hook技术截屏基于一下的原理;多数屏幕图形的绘制都是通过调用用户态gdi32.dll中的绘图函数实现的
如果利用api hook技术拦截系统中所有对这些函数的调用
就可以得到屏幕图形刷新或变化的区域坐标;然后使用api函数bitblt将刷新或者变化后的屏幕区域的ddb格式的位图拷贝到内存中
接着使用函数getbits将ddb位图转换为dbi位图
最后压缩、存储或者传输

这种方案只有捕捉到变化
才进行截屏
这样每次截屏都是有效的操作
每次(第一次除外)仅截取了栓新或变化部分
从根本上解决了数据量大的问题
但是这种技术仍然有一下缺点:1实际截屏采用的api函数
截取的是ddb位图
要经过一次格式转换
耗时较大
2如果屏幕变化区域矩形的坐标r1、r2、……rn相继到达
为了不是屏幕变化的信息丢失
通常不是逐个截取
而是将矩形坐标合并
这样就可以截取并未变化的区域
不经增加截屏的时间消耗
而且产生冗余数据
3该技术不支持directdraw技术
由于应用程序可能使用directdraw驱动程序进行直接操纵显示内存、硬件位块转移
硬件重叠和交换表面等图形操作
而不必进行gdi调用
所以此时api hook技术将失去效用
不能捕捉屏幕变化
4api hook技术在屏幕取词
远程控制和多媒体教学中都有实际的应用
但是这种技术是一种非标准的技术
微软公司并不推荐使用

1.2 使用图形驱动技术

该技术的原理:应用程序调用win32 gdi 函数进行图形输出请求
这个请求通过核心模式gdi发送
核心模式gdi把这些请求发送到相应的图形驱动程序

显示器驱动程序
通信流如图
现将该技术详细解释如下:

(1)显示器驱动输出一系列设备驱动程序接口DDI(Device Driver Interface)函数供GDI调用
信息通过这些入口点的输入/输出参数在GDI和驱动程序之间传递

(2) 在显示器驱动加载时
GDI调用显示器驱动程序函数DrvEnableDriver
在这里我们向GDI提供显示器驱动支持的
可供GDI调用的DDI函数入口点
其中部分时将要Hook的图形输出函数

(3) 在GDI调用函数DrvEnableDriver成功返回后
GDI调用显示器驱动的DrvEnablePDEV函数
在这里可以设置显示器的显示模式
然后创建一个PDEV结构
PDEV结构是物理显示器的逻辑表示

(4) 在成功创建PDEV结构之后
显示驱动为视频硬件创建一个表面
该表面可以是标准的DIB位图管理表面
然后驱动程序使该表面与一个PDEV结构相关联
这样显示驱动支持的所有绘画操作都将在该DIB位图表面上进行

(5) 当应用程序调用用户态GDI32.DLL中的绘图函数发出图形请求时
该请求将图形引擎通过相应的DDI函数发送到显示驱动
显示驱动程序将这次图形变化事件通知应用程序

(6) 应用程序接受到通知后
调用函数ExtEscape发出一个请求
并通过参数传递一个缓冲区Buffer
图形引擎调用DDI函数DrvEscape处理应用层的ExtEscape调用
将变化部分的图形数据从其创建的表面拷贝Buffer
这样数据就从核心层图形驱动传到应用层

(7) 应用程序接收到的图形数据已是DIB标准格式
所以可以直接进行压缩传输或储存

1.3图形驱动技术的特点

上面叙述了采用图形驱动实现屏幕实现截屏的原理和过程
可以看出这种技术涉及核心图形驱动的编写
实现上较为复杂
而其具备的优点主要为:

(1) 驱动技术只截取变化的屏幕区域
这一点与API Hook技术相当;但驱动技术是一种标注技术
为微软公司所推荐

(2) API Hook技术在实际截屏时
采用API函数实现
截取DDB位图
必须经过一次DDB到DIB的转换;而驱动技术直接从其管理的DIB位图(表面)中将截取区域的图形数据拷贝到应用程序
显著的降低了一次截屏的时间消耗

(3) 如果屏幕图形小区域范围变化较快
屏幕变化区域矩形坐标R1、R2、R3……、Rn相继到达
由于一次截屏时间消耗降低
区域矩形坐标叠加的概率变小
这样屏幕变化区域及时的得到了处理
不仅增加了连续性
而且截屏时间消耗和产生的数据量一般不会出现峰值
这也是这种技术的优越之处

经过以上对比
无论是做远程桌面还是屏幕录制
基于MirrorDriver的屏幕截取将会是一个不错的选择
无论从性能占用资源的大小(主要是cpu)
取得的数据量来说都要优于Hook
最近在做远程桌面的传输
所以有必要研究一下Mirror,这项技术在很多软件中都有应用
但是开源的driver我还没有看见过
因为没有精力去编写
所以才用网上的免费的driver同时也提供了api文档
driver内部实现的原理大致就是把显示输出拷贝到一个缓冲区当中
并且记录每次屏幕更新的矩形区域
根据这些输出
应用程序就很容易得到缓冲区中的数据了



参考资料: http://www.dklkt.cn/article.asp?id=114
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-18 19:21 , Processed in 0.159297 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表