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