实例介绍
【实例简介】IE浏览器监控程序,有详细的代码注释与说明
【实例截图】
【核心代码】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//------------------------------------------------------
using System.Collections;
using System.IO;//File.AppendAllText (String, String)
using System.Reflection;
using System.Runtime.InteropServices;
//------------------------------------------------------
using System.Threading;//使用延时
using SHDocVw;
using MSHTML;//程序原来是小写mshtml 升级了win10 这里必须改为大写MSHTML
using System.Web;
namespace WindowsFormsApplication1
{
public partial class frmListenToIE : Form
{
public frmListenToIE()
{
InitializeComponent();
}
//IE监控器对象_ieWatcher
private IE_Watcher _ieWatcher = null;
private void frmListenToIE_Load(object sender, EventArgs e)
{
//实例化对象_ieWatcher,将窗体对象作为参数传入?
_ieWatcher = new IE_Watcher(this);
//定义动态资料记录器对象
//_ieWatcher.UrlText = new UrlHistory("d:\\urlhistory.txt");
_ieWatcher.UrlText = new UrlHistory(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase "urlhistory.txt");//在程序运行目录下生成访问url记录文件
//btnGetWindow_Click(sender, e);//点击获取ie浏览器打开的网页的列表,把获取ie浏览器打开的网页的列表写到listBox1中
}
private void btnGetWindow_Click(object sender, EventArgs e)
{
btnGetWindow.Enabled = false;//先设置按钮不可用,防止连续点击,多次启动ie
//调用系统启动ie浏览器并访问url
System.Diagnostics.Process.Start("iexplore.exe", "http://127.0.0.1/mainpage.html");
Thread.Sleep(8000);//程序暂停8秒,等待操作系统启动ie,再向下执行,否则iexplore.exe可能还没完全运行起来,导致下面获取不到ie的url列表
//获取所有已打开的IE窗体
IList windows = _ieWatcher.GetOpenedWindows();//获取ie浏览器打开的网页的列表
foreach (SHDocVw.InternetExplorer ie in windows)
{
//在这里加入自定义对象
listBox1.Items.Add(new IE_Item(ie));//把获取ie浏览器打开的网页的列表写到listBox1中
}
//选中listBox1的第一个,点击按钮进行ie事件监听
if (listBox1.Items.Count >=1)
{
listBox1.SelectedIndex=0;//设置选中第一行,本程序中只有一行,如果是多用户切换是可以是多行
btnListen_Click(sender, e);//开始监视ie
}
}
private void btnListen_Click(object sender, EventArgs e)
{
//btnListen.Enabled = false;//先设置按钮不可用,防止连续点击
//开始监视你选中的IE窗体
if (listBox1.SelectedIndex >= 0)
{
//将选中的Item转换为IE_Item对象
IE_Item item = listBox1.SelectedItem as IE_Item;
//item.IE
_ieWatcher.ListenWindow(item.IE, this.ShowLog);//把listBox1作为对象传给_ieWatcher;把this.ShowLog处理过程传给_ieWatcher,ShowLog修改listBox2
//这样,_ieWatcher可以访问listBox1与listBox2
ShowLog("开始监视ie......");
}
}
//显示IE动态消息
public void ShowLog(string content)
{
listBox2.Items.Add(content);
//下面两句设置listBox2滚动显示到最后一行,便于查看最新的web访问url状态
listBox2.SelectedIndex = listBox2.Items.Count - 1;
listBox2.Focus();
}
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
textBox1.Text = listBox2.Text;
}
}
//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浏览器打开的网页列表: GetOpenedWindows()返回值是list
public IList GetOpenedWindows()
{
IList list = new ArrayList();
//注:要引入SHDocVw COM对象哦!!! Add Refernces - > COM Objects -> Microsft Internet Controls
//1、Microsoft Internet Controls
//2、Microsoft HTML Object Library
//Assembly Interop.SHDocVw
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();//old: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;// 在IE_Watcher中_ie是全局变量,定义是:private SHDocVw.InternetExplorer _ie = null;
_showLog = showLog;
//置顶被监控的IE窗体
if (new IntPtr(ie.HWND) != GetForegroundWindow()) SetForegroundWindow(new IntPtr(ie.HWND));
//绑定事件: IE打开网页时触发这个事件
ie.NavigateComplete2 = new SHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(OnNavigateComplete);
ie.TitleChange = new SHDocVw.DWebBrowserEvents2_TitleChangeEventHandler(OnTitleChange);
//绑定其他事件与事件处理:用户提交数据
ie.BeforeNavigate2 = new SHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(OnBeforeNavigate2);
}
//获取用户post的数据
private void OnBeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)
{
//throw new NotImplementedException();
string postDataText="";
if (PostData != null)
{
//UTF8编码的Byte[]转换为String类型:
//byte[] byteArray = new byte[100];
//String str = System.Text.Encoding.UTF8.GetString(byteArray);
postDataText = System.Text.Encoding.UTF8.GetString(PostData as byte[]); //响应 BeforeNavigate2 事件
//下面需要进行UTF8 urldecode解码postDataText
//using System.Web;
postDataText = System.Web.HttpUtility.UrlDecode(postDataText, System.Text.Encoding.UTF8);//将Url中的UTF8编码转换为简体汉字
//System.Windows.Forms.MessageBox.Show(postDataText);
}
if (_urltext != null)
{
_urltext.WriteHistory("posturl :" URL.ToString()); //写入文本文件
if(postDataText.Length >0)_urltext.WriteHistory("postdata:" postDataText); //写入用户提交的数据post数据
this.ShowMsg("打开:" URL.ToString()); //窗口显示动态消息
if (postDataText.Length > 0) this.ShowMsg("postdata:" postDataText); //显示用户提交的数据
}
}
//打开网页完成的处理
private void OnNavigateComplete(object pDisp, ref object URL)
{
if (_urltext != null)
{
_urltext.WriteHistory("打开:" URL.ToString()); //写入文本文件
this.ShowMsg("打开:" URL.ToString()); //显示动态消息
}
HtmlDocument doc = _ie.Document;
int iCount = doc.Window.Frames.Count;
for (int i = 0; i < iCount; i )
{
string strurlscr = doc.Window.Frames[i].Url.ToString();
this.ShowMsg("iframe:" strurlscr);
}
}
public void OnTitleChange(string Text)
{
this.ShowMsg("标题:" Text);
}
//跨线程访问主线程内的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;
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论