本帖最后由 liyan444 于 2011-02-17 09:50:49 编辑

解决方案 »

  1.   

    1、对浏览器进行代码注入。写一个注入程序。然后把你要实现的功能写到一个DLL中,然后把这个DLL注入到目标进程。
    2、打开目标进程,然后先在远进程申请一块内存,存放一个字符串,字符串的内容是你的DLL的名字。
    3、远进程创建远线程,线程的目标函数是loadLibrary,参数是你刚申请的那块内存的地址。于是目标进程就会对你的DLL进行load,然后你在你的DLL中实现你要的功能就行了。
    4、准备一张位图,一个上下文环境句柄,就是DC。然后用selectobject选入位图。然后对目标窗口发送一个消息:sendmessage( hwnd, WM_PAINT, ( WPARAM ) dc, 0L, ),然后你的位图中就是那个窗口的图了。或者SendMessage( WM_PRINTCLIENT, ( WPARAM )( hDCMem ), ( LPARAM )( PRF_ERASEBKGND | PRF_CLIENT | PRF_NONCLIENT ))WM_PAINT  线程窗口绘制的消息    
    WM_PRINTCLIENT  线程窗口恢复的消息这里有个问题,第一你的主程序是C#的吧,这个比较容易就可以调用win32的API  但是你的DLL如果也是DLL的话,你就涉及一个很复杂的问题就是“混合DLL” 也就是实现功能的DLL程序,里面既要包含托管程序集,也要包含非托管代码,这个比较复杂了,你需要找下相关资料。或者使用HOOK  拦截绘图指令,然后将指令在制定位图打印,这样就可以了。你的思路就是从拦截消息和模拟消息入手。
      

  2.   

    感谢andy3799的回答,我所获取的webbrowser的截图是我所写的主程序窗体内的webbrowser控件,就是说,我直接在程序窗体内放置了webbrowser控件进行flash游戏的装载,然后进行截图抓点处理的,所以就不涉及后台抓屏的问题。楼顶代码已经实现截屏基本功能,即使webbrowser控件超出窗口显示范围也仍然可以完整截取图片,但在图片比较复杂时,实时抓图时的CPU占用就非常的高,这是我比较头疼的问题,不知道您有什么好的解决方法吗?