C# 系统应用之获取IE浏览记录和IE地址栏输入网址

该文章是“个人电脑历史记录清除软件”项目的系统应用系列文章.
前面"
C# 系统应用之清除Cookies、IE临时文件、历史记录"中已经讲述了借助RunDll32.exe运行dll文件实现清除IE缓存操作,同时网上有很多方法讲述删除操作的,但怎样获取IE浏览器中最近浏览的网站历史记录和IE浏览器的地址栏输入的网址呢?这是我这篇文章需要讲解的知识.

一.Environment.GetFolderPath方法获取IE历史记录

前文说过在Windows中IE历史记录的位置为:"C:\Users\dell\AppData\Local\Microsoft\Windows\History",历史记录是存放最近时间访问过的网站地址,它以时间和站点存储.如下图所示:

那么,我们可以通过Environment.GetFolderPath(Environment.SpecialFolder.History)获取IE历史记录.

[csharp]  view plain  copy
  1. private void button3_Click(object sender, EventArgs e)  
  2. {  
  3.     //清空listBox  
  4.     listBox1.Items.Clear();  
  5.     //获取Internet历史记录文件路径  
  6.     string dirPath = Environment.GetFolderPath(Environment.SpecialFolder.History);  
  7.     listBox1.Items.Add("Internet历史记录路径:");  
  8.     listBox1.Items.Add(dirPath);  
  9.   
  10.     //遍历所有的文件夹 显示所有文件  
  11.     DirectoryInfo dir = new DirectoryInfo(dirPath);  
  12.     int num = 1;  
  13.     foreach (FileInfo file in dir.GetFiles("*.*", SearchOption.AllDirectories))  
  14.     {  
  15.         try  
  16.         {  
  17.             listBox1.Items.Add("(" + num + ")   " + file);  
  18.             num++;  
  19.         }  
  20.         catch (Exception msg)     //异常处理  
  21.         {  
  22.             MessageBox.Show(msg.Message);  
  23.         }  
  24.     }  
  25. }  

其中Environment.GetFolderPath(Environment.SpecialFolder.XXX)用于检索系统特殊文件夹的路径,常见有:
(1).History 用作 Internet 历史记录项的公共储存库的目录
(2).Cookies 用作 Internet Cookie 的公共储存库的目录
(3).InternetCache 用作 Internet 临时文件的公共储存库的目录
(4).Recent 包含用户最近使用过的文档的目录
(5).MyPictures “My Pictures”文件夹
(6).MyDocuments “我的电脑”文件夹
(7).ProgramFiles “Program files”目录

但是运行它进行删除delete操作或获取操作时,它常常会有系统文件,很多文件不能访问到.在删除中就会遇到"该文件正在另一进程使用,因此该进程无法访问此文件"或"文件访问被拒绝".而采用RunDll32.exe
调用Win32 API函数ShellExecute()执行实现的.同样,使用它获取得到的历史记录如下图所示.显然不是我想要的结果,同时在清除Cookies后还是能显示很多Cookies信息.猜测是Google、360等浏览器的?

二.RegistryKey注册表获取IE地址栏网址

打开运行(Ctrl+R)并输入"regedit"打开注册表,在"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs"下可以看见最近使用IE浏览器在地址栏输入的网址,如下图所示:

其中对应的IE浏览器如下图所示:

通过下面的代码,借助RegistryKey注册表顶级节点和获取该路径下的文件,即可显示相应的显示IE浏览器的地址栏网址.注意RegistryKey需要引用命名空间using Microsoft.Win32.

[csharp]  view plain  copy
  1. <span style="font-size:14px;">/// <summary>  
  2. /// 获取IE地址栏输入网址  
  3. /// </summary>  
  4. /// <param name="sender"></param>  
  5. /// <param name="e"></param>  
  6. private void button2_Click(object sender, EventArgs e)  
  7. {  
  8.     //定义注册表顶级节点 其命名空间是using Microsoft.Win32;  
  9.     RegistryKey historykey;  
  10.     //检索当前用户CurrentUser子项Software\\Microsoft\\Internet Explorer\\typedURLs  
  11.     historykey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Internet Explorer\\typedURLs"true);  
  12.     if (historykey != null)  
  13.     {  
  14.         //获取检索的所有值  
  15.         String[] names = historykey.GetValueNames();  
  16.         foreach (String str in names)  
  17.         {  
  18.             listBox1.Items.Add(historykey.GetValue(str).ToString());  
  19.         }  
  20.     }  
  21.     else  
  22.     {  
  23.         MessageBox.Show(this"IE地址栏没有要删除的网址""提示对话框", MessageBoxButtons.OK, MessageBoxIcon.Warning);  
  24.     }  
  25. }</span>  

运行结果如下图所示:

三.COM接口IUrlHistoryStg2获取IE浏览记录

这里主要通过王集鹄老师讲述的方法,通过IE提供的COM接口实现的.在此感谢他的文章.
参考文章:
http://bbs.csdn.net/topics/290070046代码如下:

[csharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Threading.Tasks;  
  9. using System.Windows.Forms;  
  10. using System.Runtime.InteropServices;  //命名空间  
  11. using System.Reflection;               //提供加载类型 Pointer指针  
  12. using Microsoft.Win32;                 //RegistryKey  
  13.   
  14. namespace GetIE  
  15. {  
  16.     #region COM接口实现获取IE历史记录  
  17.     //自定义结构 IUrlHistory  
  18.     public struct STATURL  
  19.     {  
  20.         public static uint SIZEOF_STATURL =  
  21.             (uint)Marshal.SizeOf(typeof(STATURL));  
  22.         public uint cbSize;                    //网页大小  
  23.         [MarshalAs(UnmanagedType.LPWStr)]      //网页Url  
  24.         public string pwcsUrl;  
  25.         [MarshalAs(UnmanagedType.LPWStr)]      //网页标题  
  26.         public string pwcsTitle;  
  27.         public System.Runtime.InteropServices.ComTypes.FILETIME  
  28.             ftLastVisited,                     //网页最近访问时间  
  29.             ftLastUpdated,                     //网页最近更新时间  
  30.             ftExpires;  
  31.         public uint dwFlags;  
  32.     }  
  33.   
  34.     //ComImport属性通过guid调用com组件  
  35.     [ComImport, Guid("3C374A42-BAE4-11CF-BF7D-00AA006946EE"),  
  36.         InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]  
  37.     interface IEnumSTATURL  
  38.     {  
  39.         [PreserveSig]  
  40.         //搜索IE历史记录匹配的搜索模式并复制到指定缓冲区  
  41.         uint Next(uint celt, out STATURL rgelt, out uint pceltFetched);  
  42.         void Skip(uint celt);  
  43.         void Reset();  
  44.         void Clone(out IEnumSTATURL ppenum);  
  45.         void SetFilter(  
  46.             [MarshalAs(UnmanagedType.LPWStr)] string poszFilter,  
  47.             uint dwFlags);  
  48.     }  
  49.   
  50.     [ComImport, Guid("AFA0DC11-C313-11d0-831A-00C04FD5AE38"),  
  51.         InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]  
  52.     interface IUrlHistoryStg2  
  53.     {  
  54.         #region IUrlHistoryStg methods  
  55.         void AddUrl(  
  56.             [MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,  
  57.             [MarshalAs(UnmanagedType.LPWStr)] string pocsTitle,  
  58.             uint dwFlags);  
  59.   
  60.         void DeleteUrl(  
  61.             [MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,  
  62.             uint dwFlags);  
  63.   
  64.         void QueryUrl(  
  65.             [MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,  
  66.             uint dwFlags,  
  67.             ref STATURL lpSTATURL);  
  68.   
  69.         void BindToObject(  
  70.             [MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,  
  71.             ref Guid riid,  
  72.             [MarshalAs(UnmanagedType.IUnknown)] out object ppvOut);  
  73.   
  74.         IEnumSTATURL EnumUrls();  
  75.         #endregion  
  76.   
  77.         void AddUrlAndNotify(  
  78.             [MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,  
  79.             [MarshalAs(UnmanagedType.LPWStr)] string pocsTitle,  
  80.             uint dwFlags,  
  81.             [MarshalAs(UnmanagedType.Bool)] bool fWriteHistory,  
  82.             [MarshalAs(UnmanagedType.IUnknown)] object    /*IOleCommandTarget*/  
  83.             poctNotify,  
  84.             [MarshalAs(UnmanagedType.IUnknown)] object punkISFolder);  
  85.   
  86.         void ClearHistory();       //清除历史记录  
  87.     }  
  88.   
  89.     [ComImport, Guid("3C374A40-BAE4-11CF-BF7D-00AA006946EE")]  
  90.     class UrlHistory /* : IUrlHistoryStg[2] */ { }  
  91.     #endregion  
  92.   
  93.     //调用COM接口IUrHistory方法实现  
  94.     public partial class Form1 : Form  
  95.     {  
  96.         public Form1()  
  97.         {  
  98.             InitializeComponent();  
  99.         }  
  100.   
  101.         private void button1_Click(object sender, EventArgs e)  
  102.         {  
  103.             IUrlHistoryStg2 vUrlHistoryStg2 = (IUrlHistoryStg2)new UrlHistory();  
  104.             IEnumSTATURL vEnumSTATURL = vUrlHistoryStg2.EnumUrls();  
  105.             STATURL vSTATURL;  
  106.             uint vFectched;  
  107.   
  108.             while (vEnumSTATURL.Next(1, out vSTATURL, out vFectched) == 0)  
  109.             {            
  110.                 richTextBox1.AppendText(string.Format("{0}\r\n{1}\r\n",vSTATURL.pwcsTitle, vSTATURL.pwcsUrl));  
  111.             }  
  112.         }  
  113.     }  
  114. }  

经过我的处理后运行结果如下图所示:

这里也提供他的一篇文章,采用另外一种方法调用IE的API函数实现 
http://blog.sina.com.cn/s/blog_589d32f5010007xf.html
但是我也遇到了一个问题,就是它的ftLastVisited(The last time the user visited this page)存储该网页最后访问时间,想通过该时间进行获取今天访问的或排序输出前100.但是获取该时间时总输出错误,同时将FILETIME转换成SYSTEMTIME或time_t都没成功.希望以后能解决.
最后该文章主要是结合自己的实际东西讲解,如果你刚好遇到类似的问题就可能对你有所帮助.同时如果在文章中遇到错误或不足的地方,请海涵!最重要的是感谢上面提到的博主.希望能把获取时间等问题也解决.请尊重作者的劳动果实,勿喷!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值