屏幕截图(屏幕采集)在一些办公、IM、远程登陆与控制、视频等软件中经常使用,通过屏幕截屏实现屏幕远程共享、抓拍成图像文件或视频文件。使用过GDI截屏与DfMirage,对两种屏幕截图方法做些比较和总结:
GDI(graphics device interface)是window提供的api函数,用于设备上下文绘制图形。sourceforge上有个屏幕录制开源程序Cam Studio,用的就是GDI截屏,可供参考。
使用步骤:
1、获取屏幕句柄
WINAPI函数::GetDesktopWindow()
2、获取屏幕DC
WINAPI函数:GetDC
3、通过BitBlt函数将屏幕图像复制到DC中
4、通过GetDIBits获取截图的位图数据
特点:简单易用,开发方便,但cpu占用率高、数据量大
DfMirage截屏
开源项目TightVNC是应用DfMirage的一个例子,tightvnc-1.3.10支持DfMirage截屏,大家可以参考代码学习,最新版的tightvnc好像不支持DfMirage。
DfMirage是Windows NT操作系统家族的的视频驱动镜像技术,视频驱动镜像技术广泛采用于远程桌面应用程序,如NetMeeting, PC Anywhere, VNC, Webex等等。
相对于GDI屏幕抓取,镜像截屏是一个技术上很优越的方法,通过虚拟驱动,系统发往显卡的命令也发给虚拟驱动,在虚拟驱动中模拟出当前系统的显示内容。
DfMirage驱动程序将屏幕表面映射到的用户的应用程序的虚拟内存空间,DfMirage跟踪