H
happymanfreeman
Unregistered / Unconfirmed
GUEST, unregistred user!
各位朋友: 大家好!
许多截图软件都能截取播放器播放(不同进程)的当前画面, 保存为硬盘上的位图文件,
如何编程 ?? 这与hook com接口有关, 此处有说明
http://topic.csdn.net/t/20051106/11/4374651.html
以下摘录自上面的链接:
普通DX的方法不能截取通过Overlay硬件加速的视频图像的
这是没办法的
除非:关闭显卡的硬件加速功能
或者使用COM Hook技术实现!
思路是:采用独立DLL,做成全局热键Hook
挂钩DDraw的DirectDrawCreate,监控FDD.CreateSurface(ddsd, FDDSPrimary, nil)(需要COM Hook技术)
获得主表面,这个时候就可以通过主表面实现截图处理:
创建OffSurface离屏表面,用IDirectDrawSurface的BltFast从PrimarySurface复制数据到OffSurface,然后Lock离屏表面,这个时候就可以保存图像数据了
HypeeSnapDX,SnagIt等都是这样实现的
要弄Overlay截图,只能用Hook的方法
要有时间偶再实现它,COM Hook的方法是修改COM接口的VMT,比起API Hook来说,简单不少的
通过Hook DDraw的DirectDrawCreate(RealOne用)同DirectDrawCreateEx(WMP用)
获得IDirectDraw(7)
再COM Hook CreateSurface,注意RealOne使用的是通过QueryInterface获得IDirectDraw2
WMP则是IDirectDraw7
Hook了CreateSurface后,就能获得OverlaySurface
所以必须在软件使用前,启动全局Hook,才有效
在需要截图的时候
Lock Overlay Surface,读取数据,马上Unlock,以免损失性能
解码读出来的数据,即可,但是由于获得的数据是显卡硬件VRAM的数据,一般是YUY2,YV12等格式,需要转换为RGB格式
现在原数据能获取了,就差格式转换,有空再弄,不同的显卡,支持的格式不一样,不同的工具所使用的格式也不一样的,所以这个是比较麻烦的
例如,在我的GF6600上,RealOne(RMVB)用的是YUY2,而WMP(AVI)用的是YV12,还与当前播放的文件格式有关
最简单的方法是,Hook CreateSurface后,禁止创建Overlay那就普通的方法都能截图,呵呵
谁能用c++builder写出来呢 ?? 谢谢!!
许多截图软件都能截取播放器播放(不同进程)的当前画面, 保存为硬盘上的位图文件,
如何编程 ?? 这与hook com接口有关, 此处有说明
http://topic.csdn.net/t/20051106/11/4374651.html
以下摘录自上面的链接:
普通DX的方法不能截取通过Overlay硬件加速的视频图像的
这是没办法的
除非:关闭显卡的硬件加速功能
或者使用COM Hook技术实现!
思路是:采用独立DLL,做成全局热键Hook
挂钩DDraw的DirectDrawCreate,监控FDD.CreateSurface(ddsd, FDDSPrimary, nil)(需要COM Hook技术)
获得主表面,这个时候就可以通过主表面实现截图处理:
创建OffSurface离屏表面,用IDirectDrawSurface的BltFast从PrimarySurface复制数据到OffSurface,然后Lock离屏表面,这个时候就可以保存图像数据了
HypeeSnapDX,SnagIt等都是这样实现的
要弄Overlay截图,只能用Hook的方法
要有时间偶再实现它,COM Hook的方法是修改COM接口的VMT,比起API Hook来说,简单不少的
通过Hook DDraw的DirectDrawCreate(RealOne用)同DirectDrawCreateEx(WMP用)
获得IDirectDraw(7)
再COM Hook CreateSurface,注意RealOne使用的是通过QueryInterface获得IDirectDraw2
WMP则是IDirectDraw7
Hook了CreateSurface后,就能获得OverlaySurface
所以必须在软件使用前,启动全局Hook,才有效
在需要截图的时候
Lock Overlay Surface,读取数据,马上Unlock,以免损失性能
解码读出来的数据,即可,但是由于获得的数据是显卡硬件VRAM的数据,一般是YUY2,YV12等格式,需要转换为RGB格式
现在原数据能获取了,就差格式转换,有空再弄,不同的显卡,支持的格式不一样,不同的工具所使用的格式也不一样的,所以这个是比较麻烦的
例如,在我的GF6600上,RealOne(RMVB)用的是YUY2,而WMP(AVI)用的是YV12,还与当前播放的文件格式有关
最简单的方法是,Hook CreateSurface后,禁止创建Overlay那就普通的方法都能截图,呵呵
谁能用c++builder写出来呢 ?? 谢谢!!