日期:2014-05-20  浏览次数:21056 次

如何取得浏览器的历史记录,读取为字符窜形式
就是读取到以后如何列出来(读取文件夹以后出现的是什么昨天、今天之类的),   如何列出所有浏览过的地址,就像IE   History   Manager(http://www.cleanersoft.com/iehistory/iehistory.htm)作的那样

------解决方案--------------------
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public class INTERNET_CACHE_ENTRY_INFOW
{
public uint dwStructSize;
public string lpszSourceUrlName;
public string lpszLocalFileName;
public uint CacheEntryType;
public uint dwUseCount;
public uint dwHitRate;
public uint dwSizeLow;
public uint dwSizeHigh;
public FILETIME LastModifiedTime;
public FILETIME ExpireTime;
public FILETIME LastAccessTime;
public FILETIME LastSyncTime;
public IntPtr lpHeaderInfo;
public uint dwHeaderInfoSize;
public string lpszFileExtension;
public uint dwReserved; //union uint dwExemptDelta;
}

[DllImport( "wininet.dll ")]
public static extern IntPtr FindFirstUrlCacheEntryEx(

string lpszUrlSearchPattern,
uint dwFlags,
uint dwFilter,
Int64 GroupId,
IntPtr lpFirstCacheEntryInfo,
ref uint lpdwFirstCacheEntryInfoBufferSize,
Pointer lpGroupAttributes,
Pointer pcbGroupAttributes,
Pointer lpReserved
);

[DllImport( "wininet.dll ")]
public static extern bool FindCloseUrlCache(IntPtr hEnumHandle);

[DllImport( "wininet.dll ")]
public static extern bool FindNextUrlCacheEntryEx(
IntPtr hEnumHandle,
IntPtr lpFirstCacheEntryInfo,
ref uint lpdwFirstCacheEntryInfoBufferSize,
Pointer lpGroupAttributes,
Pointer pcbGroupAttributes,
Pointer lpReserved);

public uint NORMAL_CACHE_ENTRY = 0x00000001;

private void button4_Click(object sender, EventArgs e)
{
IntPtr vHandle;
INTERNET_CACHE_ENTRY_INFOW vInternetCacheEntryInfo = new INTERNET_CACHE_ENTRY_INFOW();
uint vFirstCacheEntryInfoBufferSize = 0;
FindFirstUrlCacheEntryEx(null, 0, NORMAL_CACHE_ENTRY, 0, (IntPtr)null,
ref vFirstCacheEntryInfoBufferSize, null, null, null);
IntPtr vBuffer = Marshal.AllocHGlobal((int)vFirstCacheEntryInfoBufferSize);
vHandle = FindFirstUrlCacheEntryEx(null, 0, NORMAL_CACHE_ENTRY, 0,
vBuffer, ref vFirstCacheEntryInfoBufferSize,
null, null, null);
while (vHandle != null)
{
Marshal.PtrToStructure(vBuffer, vInternetCacheEntryInfo);
richTextBox1.AppendText(vInternetCacheEntryInfo.lpszSourceUrlName + "\r\n ");
Marshal.FreeCoTaskMem(vBuffer);

FindNextUrlCacheEntryEx(vHandle, (IntPtr)null, ref vFirstCacheEntryInfoBufferSize,
null, null, null);
vBuffer = Marshal.AllocHGlobal((int)vFirstCacheEntryInfoBufferSize);
if (!FindNextUrlCacheEntryEx(vHandle, vBuffer,
ref vFirstCacheEntryInfoBufferSize, null, null, null)) break;
}
Marshal.FreeCoTaskMem(vBuffer);
}

------解决方案--------------------
http://www.xfbbs.com/ArticleShow/84/Article_Show_24841.html
http://www.ccwblog.cn/ylsun/post/20061120/13258.htm


.net 2.0中的autocomplete正是通过此方法实现的,2.0中实现的原型

private void SetAutoComplete(bool reset, bool recreate)
{
if (base.IsHandleCreated && (this.childEdit != null))
{
if (this.AutoCompleteMode != AutoCompleteMode.None)
{
if ((!this.fromHandleCreate && recreate) && base.IsHandleCreated)
{