IE浏览器监控程序-监控IE窗体URL动态加载网页等信息

本程序由SHDocVw COM实现的。在项目工程内加入COM 引用:
Add Refernces - > COM Objects -> Microsft Internet Controls

主要用到SHDocVw.ShellWindowsCOM接口 ,SHDocVw.ShellWindowsClass类,
及SHDocVw.InternetExplorer 接口。

最重要的是IE窗口InternetExplorer接口,该接口继承IWebBrowser2. 

IWebBrowser2接口metadata资料如下:

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace SHDocVw
{
   [Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E")]
   [TypeLibType(4176)]
    public  interface IWebBrowser2 : IWebBrowserApp
   {
      [DispId(555)]
       bool AddressBar {  getset; }
      [DispId(200)]
       object Application {  get; }
      [DispId(212)]
       bool Busy {  get; }
      [DispId(202)]
       object Container {  get; }
      [DispId(203)]
       object Document {  get; }
      [DispId(400)]
       string FullName {  get; }
      [DispId(407)]
       bool FullScreen {  getset; }
      [DispId(209)]
       int Height {  getset; }
      [DispId(-515)]
       int HWND {  get; }
      [DispId(206)]
       int Left {  getset; }
      [DispId(210)]
       string LocationName {  get; }
      [DispId(211)]
       string LocationURL {  get; }
      [DispId(406)]
       bool MenuBar {  getset; }
      [DispId(0)]
       string Name {  get; }
      [DispId(550)]
       bool Offline {  getset; }
      [DispId(201)]
       object Parent {  get; }
      [DispId(401)]
       string Path {  get; }
      [DispId(-525)]
      tagREADYSTATE ReadyState {  get; }
      [DispId(552)]
       bool RegisterAsBrowser {  getset; }
      [DispId(553)]
       bool RegisterAsDropTarget {  getset; }
      [DispId(556)]
       bool Resizable {  getset; }
      [DispId(551)]
       bool Silent {  getset; }
      [DispId(403)]
       bool StatusBar {  getset; }
      [DispId(404)]
       string StatusText {  getset; }
      [DispId(554)]
       bool TheaterMode {  getset; }
      [DispId(405)]
       int ToolBar {  getset; }
      [DispId(207)]
       int Top {  getset; }
      [DispId(204)]
       bool TopLevelContainer {  get; }
      [DispId(205)]
       string Type {  get; }
      [DispId(402)]
       bool Visible {  getset; }
      [DispId(208)]
       int Width {  getset; }
      
      [DispId(301)]
       void ClientToWindow( ref  int pcx,  ref  int pcy);
      [DispId(502)]
       void ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt,  ref  object pvaIn,  ref  object pvaOut);
      [DispId(303)]
       object GetProperty( string Property);
      [DispId(100)]
       void GoBack();
      [DispId(101)]
       void GoForward();
      [DispId(102)]
       void GoHome();
      [DispId(103)]
       void GoSearch();
      [DispId(104)]
       void Navigate( string URL,  ref  object Flags,  ref  object TargetFrameName,  ref  object PostData,  ref object Headers);
      [DispId(500)]
       void Navigate2( ref  object URL,  ref  object Flags,  ref  object TargetFrameName,  ref  object PostData,  ref object Headers);
      [DispId(302)]
       void PutProperty( string Property,  object vtValue);
      [DispId(501)]
      OLECMDF QueryStatusWB(OLECMDID cmdID);
      [DispId(300)]
       void Quit();
      [DispId(-550)]
       void Refresh();
      [DispId(105)]
       void Refresh2( ref  object Level);
      [DispId(503)]
       void ShowBrowserBar( ref  object pvaClsid,  ref  object pvarShow,  ref  object pvarSize);
      [DispId(106)]
       void Stop();
   }
}

看看吧,IWebBrowser2接到口内是不是有很多我们关心的方法和属性? 接下来看实现吧!

IE_Watcher类:取名为IE窗口监视器, 啥好听的名字自己取呗!
//IE窗口监视器
public
  class IE_Watcher
{
    private Form _owner =  null;
   
    public IE_Watcher(Form owner)
   {
      _owner = owner;
   }
   
   [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling =  true)]
    private  static  extern IntPtr GetForegroundWindow();  //WINAPI 获取当前活动窗体的句柄 
   
   [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling =  true)]
    private  static  extern  bool SetForegroundWindow(IntPtr hWnd);  //WINAPI 设置当前活动窗体的句柄 
   
    //跨线程访问主线程内的Log控件,自定义委托 
    public  delegate  void ShowLogHandle( string msg);
   
    //Txt文件记录器 
    private UrlHistory _urltext =  null;
    public UrlHistory UrlText {  get {  return _urltext; }  set { _urltext = value; } }
   
   
    //获取IE浏览器打开的网页列表 
    public IList GetOpenedWindows()
   {
      IList list =  new ArrayList();
      
       //注:要引入SHDocVw COM对象哦!!! Add Refernces - > COM Objects -> Microsft Internet Controls 
       //Assembly Interop.SHDocVw 
      SHDocVw.ShellWindows shellWindows =  new SHDocVw.ShellWindowsClass();
       string filename;
       foreach (SHDocVw.InternetExplorer ie  in shellWindows)
      {
         filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
         
          //注:iexplore, 如Maxthon浏览器 
          if (filename.Equals("iexplore")) list.Add(ie);
      }
      
       return list;
   }
   
    //当前监控的IE窗体对象 
    private SHDocVw.InternetExplorer _ie =  null;
    public SHDocVw.InternetExplorer CurrentIE {  get {  return _ie; } }
   
    //显示动态消息委托,用于跨线程 
    private ShowLogHandle _showLog =  null;
   
    //开始监控IE窗体 
    public  void ListenWindow(SHDocVw.InternetExplorer ie, ShowLogHandle showLog)
   {
      _ie = ie;
      _showLog = showLog;
      
       //置顶被监控的IE窗体 
       if ( new IntPtr(ie.HWND) != GetForegroundWindow()) SetForegroundWindow( new IntPtr(ie.HWND));
      
       //绑定事件: IE打开网页时触发这个事件 
      ie.NavigateComplete2 +=  newSHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(OnNavigateComplete);
      
      
      ie.TitleChange +=  new SHDocVw.DWebBrowserEvents2_TitleChangeEventHandler(OnTitleChange);
   }
   
    public  void OnTitleChange( string Text)
   {
       this.ShowMsg("标题:" + Text);
   }
   
    //打开网页完成 
    private  void OnNavigateComplete( object pDisp,  ref  object URL)
   {
       if (_urltext !=  null)
      {
         _urltext.WriteHistory(URL.ToString());  //写入文本文件 
         
          this.ShowMsg("打开:" + URL.ToString());  //显示动态消息 
      }
   }
   
    //跨线程访问主线程内的Log控件,给控件赋值 
    private  void ShowMsg( string msg)
   {
      _owner.Invoke(_showLog, msg);
   }
}



将IE窗体动态消息写文件
/// <summary> 
/// Txt文件记录器 
/// </summary> 
public  class UrlHistory
{
    private  string _file;
   
    public UrlHistory( string file)
   {
      _file = file;
   }
   
    public  void WriteHistory( string content)
   {
      File.AppendAllText(_file, content + "\r\n");
   }
}

在ListBox控件Items属性插入自定义对象所定义的类

/// <summary> 
/// IE窗体对象,用于在ListBox内显示 
/// </summary> 
public  class IE_Item
{
    private SHDocVw.InternetExplorer _ie =  null;
    public SHDocVw.InternetExplorer IE {  get {  return _ie; } }
   
    public  string UrlName {  get {  return _ie.LocationName; } }
   
    public  string UrlAddress {  get {  return _ie.LocationURL; } }
   
    public IE_Item(SHDocVw.InternetExplorer ie)
   {
      _ie = ie;
   }
 
    //关键是这个重载的方法哦!!! 在ListBox内显示的资料  
    public  override  string ToString()
   {
       return _ie.LocationName;
   }
}

好了,测试窗体代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace TestProject
{
    public partial  class frmListenToIE : Form
   {
       //IE窗体监控器 
       private IE_Watcher _ieWatcher =  null;
      
       public frmListenToIE()
      {
         InitializeComponent();
      }
      
       private  void frmListenToIE_Load( object sender, EventArgs e)
      {
          //实例化对象,将窗体对象作为参数传入,为什么呢? 
         _ieWatcher =  new IE_Watcher( this);
         
          //定义动态资料记录器对象 
         _ieWatcher.UrlText =  new UrlHistory("c:\\urlhistory.txt");
      }
      
       private  void btnGetWindow_Click( object sender, EventArgs e)
      {
          //获取所有已打开的IE窗体 
         IList windows = _ieWatcher.GetOpenedWindows();
         
          foreach (SHDocVw.InternetExplorer ie  in windows)
         {
             //在这里加入自定义对象哦!!! 
            listBox1.Items.Add( new IE_Item(ie));
         }
      }
      
       private  void btnListen_Click( object sender, EventArgs e)
      {
          //开始监视你选中的IE窗体 
          if (listBox1.SelectedIndex >= 0)
         {
             //将选中的Item转换为IE_Item对象 
            IE_Item item = listBox1.SelectedItem  as IE_Item;
            
             //item.IE 
            _ieWatcher.ListenWindow(item.IE,  this.ShowLog);
         }
      }
      
       //显示IE动态消息 
       public  void ShowLog( string content)
      {
         listBox2.Items.Add(content);
         listBox2.SelectedIndex = listBox2.Items.Count - 1;
         listBox2.Focus();
      }
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值