请大家帮忙分析关于DDraw中的overlay层数据的获取有关问题

请大家帮忙分析关于DDraw中的overlay层数据的获取问题
小弟现在要做一个屏幕截图的程序,要能截到DirectDraw加速状态下的视频画面,传统的GDI+和DirectX截图方式都不能截到,后来在网上查了资料,有一种方式说是:

1. 先将自己的DLL注入到每一个进程;
2. 通过API Hook拦截DirectX的DirectDrawCreate(Ex);
3. 然后再用COM Hook替换CreateSurface函数,进而控制视频播放的overlay层获取图像数据;或者直接不让其创建overlay层,再通过传统方式截图;

但是这种方式只适合在视频还未播放之前,如果视频已经播放了,是没办法控制的(对DirectX不是很了解,不知道是不是这样)。

我在网上找了一个专业的截图软件,HyperSnap-Dx,下载地址:http://www.skycn.com/soft/2269.html


这里面可以在菜单“捕获”中选择“启用视频或游戏捕捉”,勾选“视频捕捉”后,截屏时可以截到其中包含的视频播放画面,我看了一下,它是在勾选“视频捕捉”后,将安装目录下的 OverlayHook.dll 注入到了每一个进程,不知道它做了什么操作,就可以截到视频了!
用Dependency Walker查看,这个dll里有4个方法:

get_overlay_picture
set_frame_rate
start_engine
stop_engine

希望大家能帮我分析一下,怎么样才能达到它这样的截图效果,我在网上查资料的时候一直都没有个比较好的方式,甚至有人说要用镜像驱动来做,我的要求没那么高,只要能达到这个软件的效果就很满足了!相信很多人都遇到过这个问题!

再次谢谢大家了!





------解决方案--------------------
应该是对视频流的抓取,就像一些下载flash的方式一样吧……具体不清楚- -!我猜的,下去试验下
------解决方案--------------------
一样是ddraw hook,只是和你的方式不同而已
你是用的继承接口的方式,在create的时候,直接new的你自己的class返回的,是吧
这就要求你在程序启动(最少是create)前注入你的dll,并且一定要完成对create的hook,不然就检测不到了。

可以直接hook接口的方法,通杀
------解决方案--------------------
呵呵,我也用过这个方法,完全可行。
注意把自己的surface写成一直有效,也就是不要释放了虚表。
还有如果是注如的话,一定要使用LoadLibrary的形式调用ddraw函数,不然这个ddraw.dll就会每个进程都有了,而其实是被你的注入代码带入的,并不是进程本身使用了该dll
------解决方案--------------------
关于不使用overlay,没有比较理想的方式,几个参考方案:
1。直接修改注册表,禁了硬件加速
2。com hook到CreateSurface,判断其结构参数,带了overlay标志就不允许其创建。
3。自己先创建overlay,由于overlay是临界资源类型,你先创建了其他程序就不能再使用。
暂时想到这3点,不过都不是幽雅的处理方式。