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曆史記錄.
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接口實現的.在此感謝他的文章.
參考文章:https://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函數實現 https://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點半 原創CSDNhttps://blog.csdn.net/eastmount/)
最後更新:2017-04-03 12:55:58