C# 对Webbrowser实事抓图及资源消耗大的问题 本帖最后由 liyan444 于 2011-02-17 09:50:49 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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 拦截绘图指令,然后将指令在制定位图打印,这样就可以了。你的思路就是从拦截消息和模拟消息入手。 感谢andy3799的回答,我所获取的webbrowser的截图是我所写的主程序窗体内的webbrowser控件,就是说,我直接在程序窗体内放置了webbrowser控件进行flash游戏的装载,然后进行截图抓点处理的,所以就不涉及后台抓屏的问题。楼顶代码已经实现截屏基本功能,即使webbrowser控件超出窗口显示范围也仍然可以完整截取图片,但在图片比较复杂时,实时抓图时的CPU占用就非常的高,这是我比较头疼的问题,不知道您有什么好的解决方法吗? C# 怎么实现带有子窗口的界面(不是mid窗口)....... 怎么在textbox中实现对listbox中项的模糊查询,并选定它 问一个问题 C#写入数据到mysql数据库,这段代码哪里有问题?请教各位! C#中如何调用API 使其达到 调用系统记事本中 查找和替换 对话框的效果 数据库问题 谁会sql2005报表服务的进来看啊,焦急等待 关于自制控件设计中移动时变色问题 求所有的using指令集 C#的语言怎么调用第三方的OCX控件?最好有例子。 请教2个按钮的代码 求解,如何实现usb摄像头的热插拔
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 拦截绘图指令,然后将指令在制定位图打印,这样就可以了。你的思路就是从拦截消息和模拟消息入手。