如何实现隐藏窗口的抓图?
或者是抓取一个被其他窗口覆盖的窗口图?
谢谢!:)

解决方案 »

  1.   

    小吉的办法可行。
    我不知道还有什么其他办法,因为当用户看不见窗口内容时,其内容好象是抓不出来的,即使你有他的HDC也不行。因我以前好象试过。
      

  2.   

    如果Bitmap句柄呢?我没试成功,用DC的Bitmap可能吗?
      

  3.   

    Bitmap句柄被选入DC后,通过DC绘出的就是其内容,所以若通过DC绘不出位图,就说明该Bitmap对象中没有内容,这与得到Bitmap句柄有关系吗?一般情况下,窗口DC都是即时刷新的,没显示出来前,并不存在内存位图,当收到WM_PAINT消息后,会通过默认或指定的窗口过程(WndProc)根据相关数据处理重绘,以显示内容。
    特殊情况下,程序会自己维护一份窗体客户区的位图备份,用于快速重绘(如:VB的AutoRedraw=True时),但该位图只有程序自己掌握,外部程序得不到。实际上为减少内存占用,绝大多数程序很少会浪费大量资源去保存显示的位图内容的,都是只保留窗口相关位置状态等信息数据,在需要时重绘到屏幕上。
      

  4.   

    如果说没办法获得被覆盖的窗口的图片,那Windows又如何实现半透明窗口的呢?我也知道Windows2000以上提供了一个API来处理,但是总要有个能取得图像的途径吧?如果图像都不在内存中,那也不可能就一个“因为那个API是Windows的函数”就说明了吧。能解释一下吗?
      

  5.   

    怎么说:没办法获得被覆盖的窗口的图片?看来前面白说了:(被覆盖的窗口的图片,对Windows而言,是状态数据不是图片,只需通知它重绘,那时绘出来的就是你要的图片。
    半透明窗口对于系统来说也很简单,下层窗体中被半透明窗口覆盖的部分会被标记为有效区域,其重绘时产生的的位图,用于与上层窗体进行Alpha合成输出到屏幕。正是因为这个原因,被半透明窗口覆盖的窗体图形动画处理也会变慢,试想如果有现成的位图,下层窗体就无需参与覆盖部分的重绘,怎会变慢呢?所以获得被覆盖的窗口的图片办法,就是强制窗体重绘,并抓取其输出位图。
      

  6.   

    我知道可以用API向目标窗口发信息让其窗口重绘,不过这个函数不常用,也就用过一次,还是我认为很久以前的事了,都忘得差不多了,所以理解上可能有问题,请不要见怪。
        重绘窗口的操作完成后,窗口会从底层显示出来吗?我记得好像不会。那怎么抓图呢?难道发出重绘信息后就可以通过设备或位图句柄获得图像了吗?这个时候设备中就会选入位图了吗?那么那位图又能保持多久呢,不会一重绘完就删除了吧?如果说删除了又怎么抓图呢?能说得详细点吗?
      

  7.   

    所以说你在抓之前要先把目标激活,再抓取,再把目标恢复到之前的状态,好好看看SHOWWINDOW这个API的参数吧。
      

  8.   

    仔细想想:如果窗口界面都是靠保存位图来维护,那内存与GDI资源都会不够用的。激活窗口会引发窗体重绘,可将窗体状态数据转为位图。所以这种方法一点不搞笑!
      

  9.   

    我想过一个方法,就是用GF2的显卡扩展一个虚拟的桌面,然后把窗口放到虚拟的桌面中。这可以抓到图,而且操作也差不多,就是改变一下抓取位置,非常方便,但是,也只能是显卡驱动中支持虚拟扩展桌面的显卡才行,还要自己去设置好,通用性不大。但这就像把窗口隐藏起来并能抓到图的效果一样了,只是屏幕大了些,呵呵。还有,homezj(小吉)
        看你的意思是说激活窗口是个好办法啰,我可不这么认为。我想,如果用激活窗口的办法,必定会改变窗口的层循序,而且还会有闪烁的不好效果,但是使用Win2000的半透明函数时,下面就算有好几层的窗口,所有的窗口都不会变动层顺序,更不会闪烁,我想微软也不会一连激活一串的窗口后然后各自抓图,然后再调整各自窗口间的层顺序,再进行自己窗口的透明运算吧。我的看法是,肯定有一个更好的方法,只是我们都不知道罢了,但也不能选一个自己知道的就硬着头皮上吧,所以我才提出这个问题想多了解一下的呀。你的观点我不大认同希望你不要见怪呀,以后还希望你能多多帮忙呢。先谢了。