关闭

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

标签: C#系统应用获取IE历史记录获取地址栏网址UrlHistory接口API函数
4420人阅读 评论(0) 收藏 举报
分类:

该文章是“个人电脑历史记录清除软件”项目的系统应用系列文章.
前面"
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历史记录.

private void button3_Click(object sender, EventArgs e)
{
    //清空listBox
    listBox1.Items.Clear();
    //获取Internet历史记录文件路径
    string dirPath = Environment.GetFolderPath(Environment.SpecialFolder.History);
    listBox1.Items.Add("Internet历史记录路径:");
    listBox1.Items.Add(dirPath);

    //遍历所有的文件夹 显示所有文件
    DirectoryInfo dir = new DirectoryInfo(dirPath);
    int num = 1;
    foreach (FileInfo file in dir.GetFiles("*.*", SearchOption.AllDirectories))
    {
        try
        {
            listBox1.Items.Add("(" + num + ")   " + file);
            num++;
        }
        catch (Exception msg)     //异常处理
        {
            MessageBox.Show(msg.Message);
        }
    }
}

其中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.

/// <summary>
/// 获取IE地址栏输入网址
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
    //定义注册表顶级节点 其命名空间是using Microsoft.Win32;
    RegistryKey historykey;
    //检索当前用户CurrentUser子项Software\\Microsoft\\Internet Explorer\\typedURLs
    historykey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Internet Explorer\\typedURLs", true);
    if (historykey != null)
    {
        //获取检索的所有值
        String[] names = historykey.GetValueNames();
        foreach (String str in names)
        {
            listBox1.Items.Add(historykey.GetValue(str).ToString());
        }
    }
    else
    {
        MessageBox.Show(this, "IE地址栏没有要删除的网址", "提示对话框", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    }
}

运行结果如下图所示:

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

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

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.Runtime.InteropServices;  //命名空间
using System.Reflection;               //提供加载类型 Pointer指针
using Microsoft.Win32;                 //RegistryKey

namespace GetIE
{
    #region COM接口实现获取IE历史记录
    //自定义结构 IUrlHistory
    public struct STATURL
    {
        public static uint SIZEOF_STATURL =
            (uint)Marshal.SizeOf(typeof(STATURL));
        public uint cbSize;                    //网页大小
        [MarshalAs(UnmanagedType.LPWStr)]      //网页Url
        public string pwcsUrl;
        [MarshalAs(UnmanagedType.LPWStr)]      //网页标题
        public string pwcsTitle;
        public System.Runtime.InteropServices.ComTypes.FILETIME
            ftLastVisited,                     //网页最近访问时间
            ftLastUpdated,                     //网页最近更新时间
            ftExpires;
        public uint dwFlags;
    }

    //ComImport属性通过guid调用com组件
    [ComImport, Guid("3C374A42-BAE4-11CF-BF7D-00AA006946EE"),
        InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface IEnumSTATURL
    {
        [PreserveSig]
        //搜索IE历史记录匹配的搜索模式并复制到指定缓冲区
        uint Next(uint celt, out STATURL rgelt, out uint pceltFetched);
        void Skip(uint celt);
        void Reset();
        void Clone(out IEnumSTATURL ppenum);
        void SetFilter(
            [MarshalAs(UnmanagedType.LPWStr)] string poszFilter,
            uint dwFlags);
    }

    [ComImport, Guid("AFA0DC11-C313-11d0-831A-00C04FD5AE38"),
        InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface IUrlHistoryStg2
    {
        #region IUrlHistoryStg methods
        void AddUrl(
            [MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,
            [MarshalAs(UnmanagedType.LPWStr)] string pocsTitle,
            uint dwFlags);

        void DeleteUrl(
            [MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,
            uint dwFlags);

        void QueryUrl(
            [MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,
            uint dwFlags,
            ref STATURL lpSTATURL);

        void BindToObject(
            [MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,
            ref Guid riid,
            [MarshalAs(UnmanagedType.IUnknown)] out object ppvOut);

        IEnumSTATURL EnumUrls();
        #endregion

        void AddUrlAndNotify(
            [MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,
            [MarshalAs(UnmanagedType.LPWStr)] string pocsTitle,
            uint dwFlags,
            [MarshalAs(UnmanagedType.Bool)] bool fWriteHistory,
            [MarshalAs(UnmanagedType.IUnknown)] object    /*IOleCommandTarget*/
            poctNotify,
            [MarshalAs(UnmanagedType.IUnknown)] object punkISFolder);

        void ClearHistory();       //清除历史记录
    }

    [ComImport, Guid("3C374A40-BAE4-11CF-BF7D-00AA006946EE")]
    class UrlHistory /* : IUrlHistoryStg[2] */ { }
    #endregion

    //调用COM接口IUrHistory方法实现
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IUrlHistoryStg2 vUrlHistoryStg2 = (IUrlHistoryStg2)new UrlHistory();
            IEnumSTATURL vEnumSTATURL = vUrlHistoryStg2.EnumUrls();
            STATURL vSTATURL;
            uint vFectched;

            while (vEnumSTATURL.Next(1, out vSTATURL, out vFectched) == 0)
            {          
                richTextBox1.AppendText(string.Format("{0}\r\n{1}\r\n",vSTATURL.pwcsTitle, vSTATURL.pwcsUrl));
            }
        }
    }
}

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

这里也提供他的一篇文章,采用另外一种方法调用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都没成功.希望以后能解决.
最后该文章主要是结合自己的实际东西讲解,如果你刚好遇到类似的问题就可能对你有所帮助.同时如果在文章中遇到错误或不足的地方,请海涵!最重要的是感谢上面提到的博主.希望能把获取时间等问题也解决.请尊重作者的劳动果实,勿喷!!!
(By:Eastmount 2014-4-3 夜2点半 原创CSDNhttp://blog.csdn.net/eastmount/)

2
0
查看评论

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

该文章是“个人电脑历史记录清除软件”项目的系统应用系列文章. 前面"C# 系统应用之清除Cookies、IE临时文件、历史记录"中已经讲述了借助RunDll32.exe运行dll文件实现清除IE缓存操作,同时网上有很多方法讲述删除操作的,但怎样获取IE浏览器中最近浏览的网站历史...
  • u013566880
  • u013566880
  • 2014-04-05 12:48
  • 515

C#浏览器自动填表demo(三种方式)

  • 2017-12-10 11:06
  • 42.23MB
  • 下载

如何去掉Windows资源管理器和IE地址栏的自动补全功能

本来这个功能还是比较实用的,无奈用起来太令人气愤了,地址栏的内容经常乱跳,因此决定关掉这个烂功能参考http://support.microsoft.com/kb/217148/zh-cn:要对 Web 地址起启用行内“自动完成”功能,请在 Internet Explorer 中执行以下步骤: ...
  • asklxf
  • asklxf
  • 2007-12-21 13:41
  • 5932

实时获取浏览器的地址栏的网页地址

探讨一个问题,我想写一个exe,功能就是实时的获取浏览器地址栏的网页地址,有没有什么好的想法,  之前许多人说通过findwindows来获取浏览器的句柄,然后发消息获取浏览器地址栏编辑框的内容,但是这样我觉得不是很好,  因为这种方式对ie6还可以,如果是googl...
  • jiangqin115
  • jiangqin115
  • 2015-08-17 20:52
  • 1746

如何隐藏IE地址栏

IE7.0 为了安全性屏蔽掉了,防止钓鱼网站  再补充一下哈 你如果实在要隐藏地址栏 需要设置一下IE的属性 右击IE,在internet属性的安全选项卡中,打开自定义级别,找到“容许网站打开没有地址栏和状态栏的窗口”,然后将这一项设为“启用”就可以了,默认是禁用的哦
  • ittraining
  • ittraining
  • 2014-04-23 15:34
  • 2289

IE浏览器地址栏输入中文乱码问题

猎豹浏览器和chrome浏览器传递参数时是按utf-8传递的,而IE浏览器传递参数时采用编码为gb2312,所以地址栏中输入http://127.0.0.1:8080/Aweb/Test?name=中国&like=哈哈,中文是以gb2312编码的,然后传递给服务器,服务器接收时是按照iso8...
  • scl1991
  • scl1991
  • 2015-07-02 21:55
  • 1570

IE地址栏的最大长度

最权威的解释—-Maximum URL length is 2,083 characters in Internet Explorer. IE的url最大长度是2083个字节,可以用于GET传递数据的长度是2048个字节POST方式传递的数据不受这个长度影响,它的值通过浏览器header传...
  • lanmao100
  • lanmao100
  • 2008-01-04 14:38
  • 625

IE地址栏可输入的最大字符数

 IE地址栏最大的url长度是2083个字符,最大可以传递数据的长度是2048个字符,这个适用于POST和GET方式,注意这里说的POST是只在地址栏中输入参数,但是提交时取用POST方式。如果你用GET方式,传递的数据最大是2048个字符,刚才说了IE地址栏最大的url长度是2083个字...
  • m0085_cn
  • m0085_cn
  • 2008-03-24 09:44
  • 2028

C#通过Win32 API操作IE浏览器 --- 获得IE的URL

using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices; //操作Win32API必须要引入的命名空间n...
  • ziqing
  • ziqing
  • 2007-11-22 13:22
  • 2055

C#获得IE进程内的IDocument对象代码

C#获得IE进程内的IDocument对象代码    class Win32API    {        [DllImport("user32", ...
  • shiff
  • shiff
  • 2007-12-05 19:09
  • 1845
    个人资料
    • 访问:2331182次
    • 积分:21632
    • 等级:
    • 排名:第412名
    • 原创:270篇
    • 转载:10篇
    • 译文:0篇
    • 评论:1652条
    个人博客
    作者:杨秀璋
    学历:本科-北京理工大学
               硕士-北京理工大学
    现任教于贵财财经大学信息学院
    http://www.eastmountyxz.com

    简介:自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真心传授给自己的学生,帮助更多陌生人。

    贵州纵美路迢迢,
    为负劳心此一遭。
    收得破书三四本,
    也堪将去教尔曹。

    娜美人生,醉美生活。
    他和她经历风雨,慢慢变老。
    博客专栏
    牛人博客
    最新评论