蛙蛙推荐:蛙蛙牌网页捕捉器
蛙蛙推荐:蛙蛙牌网页捕捉器
摘要:你有没有看到一篇好文章想保存到本地,有没有想过只保存网页选中的部分而不要那些不必要的导航和广告,本贴告诉你达到这个目的的思路及主要代码。
思路:首先我们要获取到所有IE窗口,无论是哪个IE进程的,这个我们要用引用"Microsoft Internet Controls(SHDocVw)"的com组件,用它的SHDocVw.ShellWindowsClass类来枚举用户打开的所有的IE页面。然后我们要用GetForegroundWindow API来获取前置的窗口,再用GetClassName API来获取前置窗口的Class,如果是“IEFrame”,说明当前窗口是IE,然后枚举所有的IE页面,对比每个IE页面的句柄是否是当前活动窗口的句柄,如果是,那么这个SHDocVw.InternetExplorer就是对应这当前处于活动窗口的IE的对象。为了方便操作HTML模型和IE对象,我们再引入Microsoft.mshtml程序集(这个是.NET程序集,前面那个SHDocVw是个Com互操作程序集,不过应该每台机器都装了IE,所以SHDocVw不需要单独分发)。SHDocVw.InternetExplorer.Document可以转换成mshtml.IHTMLDocument2类型,然后mshtml.IHTMLDocument2.body有innerHTML属性,就是当前网页的HTML文本了。mshtml.IHTMLDocument2.selection.createRange()表示用户在网页上选中的区域,这个做web的应该很熟,该方法返回mshtml.IHTMLTxtRange类型,该类型有htmlText属性,表示用户所选区域的html文本。
这样所有必要的因素都有了,把这些综合在一起,就可以写个工具来快速保存你感兴趣的网页了。
另外本文还演示如下技巧:
1、如何实现无标题窗口,如果拖动无标题窗口,如何让窗口永远处于前置状态;
2、如何解决前置窗口上的按钮要点击两次才能生效的问题,第一次点击是激活窗口,第二次单击按钮才会生效;
3、让窗体初始化在屏幕的右下角;
主要代码如下,不长
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using mshtml;
using SHDocVw;
namespace CapIe
{
public partial class Form1 : Form
{
private fields
Form 相关
网页捕捉相关
窗体拖动相关
下拉菜单处理
private void toolStrip1_MouseHover(object sender, EventArgs e)
{
Focus(); //解决按钮要点击两次的bug
}
}
}
改进:目前只能当IE为活动窗口时,才能捕捉网页,我们可以先获取鼠标位置,然后用WindowFromPoint获取鼠标所在区域的窗口,再获取这个窗口的Class,看是否是“Internet Explorer_Server”,然后下面的步骤和上面的一样,这样的做的好处是一些IE内核的浏览器,比如傲游啦,GreenBrowser等浏览器也能想办法捕捉网页,因为只要是IE内核,显示网页的那部分的的Window的Class都是"Internet Explorer_Server"。找到这个窗口后再调用GetParent获取上层的窗口,再和ShellWindows枚举出来的窗口句柄对比,找到当前打开的网页。
private static extern IntPtr WindowFromPoint(
Point Point //坐标
);
[DllImport("User32.dll")]
public static extern IntPtr GetParent(IntPtr hWnd);
int x = Cursor.Position.X;
int y = Cursor.Position.Y;
Point p = new Point(x, y);
IntPtr formHandle = WindowFromPoint(p);
另外,就是像IE7这种的多标签浏览器,获取当前窗口,还要获取当前激活的标签页是哪个,否则捕获的网页可能不对,这就需要再想办法了,留给大家吧,想实现的话具体大家参考相关链接吧。
点击下载示例(不包含Microsoft.mshtml.dll,应该在C:\Program Files\Microsoft.NET\Primary Interop Assemblies目录下) cap_ie.zip
相关链接:
SOS!!!如何获取鼠标再在的窗口的句柄
http://topic.csdn.net/t/20010612/14/156129.html
GetWindowRect,GetClientRect,和ScreenToClient
http://hi.baidu.com/yh121212/blog/item/521172c646b7211b9c163d3c.html
请教out参数的用法
http://topic.csdn.net/t/20050304/12/3824234.html
从C#程序中调用非受管DLLs [择自博客园]
http://blog.csdn.net/ericksky/archive/2006/07/27/988128.aspx
GetCursorPos/WindowFromPoint/SendMessage (用API函数向Edit框发送字符)
http://hi.baidu.com/gamevip/blog/item/cd4ac8119cef2111b8127b35.html
如何连接到 Internet Explorer 的运行实例
http://support.microsoft.com/kb/176792
FileNotFoundException error using SHDocVw.ShellWindows
http://bytes.com/forum/thread656636.html
VB Webbrowser控件使用方法
http://www.zxbc.cn/html/20080216/31664_3.html
从HWnd得到IWebbrowser2接口
http://www.zxboy.com/article.asp?id=100
GetActiveWindow与GetForegroundWindow两者有何区别?
http://www.qqgb.com/Program/VC/VCJQ/Program_166012.html
MSHTML, Dom, and copying objects from a WebBrowser Control
http://lazycoders.blogspot.com/2007/06/mshtml-dom-and-copying-objects-from.html
我想找到当前IE(7)当前的文档对象,已有部分代码,请求大家帮忙!C#_WinFrom
http://topic.csdn.net/u/20070404/20/17979fe9-a223-44dc-aab5-b8edb8fbffd0.html
Internet Explorer Activity Monitor
http://www.codeproject.com/KB/cs/IE_Activity_Monitor.aspx?fid=229256&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=1350993
C#获得IE进程内的IDocument对象代码
http://blog.csdn.net/shiff/archive/2007/12/05/1919000.aspx