如何取得浏览器的历史记录,读取为字符窜形式
就是读取到以后如何列出来(读取文件夹以后出现的是什么昨天、今天之类的), 如何列出所有浏览过的地址,就像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)
{
AutoCompleteMode autoCompleteMode = this.AutoCompleteMode;
this.autoCompleteMode = AutoCompleteMode.None;
base.RecreateHandle();
this.autoCompleteMode = autoCompleteMode;
}
if (this.AutoCompleteSource == AutoCompleteSource.CustomSource)
{
if (this.AutoCompleteCustomSource != null)
{
if (this.AutoCompleteCustomSource.Count == 0)
{
int flags = -1610612736;
SafeNativeMethods.SHAutoComplete(new HandleRef(this, this.childEdit.Handle), flags);
}
else if (this.stringSource != null)
{
this.stringSource.RefreshList(this.GetStringsForAutoComplete(this.AutoCompleteCustomSource));
}
else
{
this.stringSource = new StringSource(this.GetStringsForAutoComplete(this.AutoCompleteCustomSource));
if (!this.stringSource.Bind(new HandleRef(this, this.childEdit.Handle), (int) this.AutoCompleteMode))
{
throw new ArgumentException(SR.GetString( "AutoCompleteFailure "));
}
}
}
}
else if (this.AutoCompleteSource == AutoCompleteSource.ListItems)
{
if (this.DropDownStyle == ComboBoxStyle.DropDownList)
{
int flags = -1610612736;
SafeNativeMethods.SHAutoComplete(new HandleRef(this, this.childEdit.Handle), flags);
}
else if (this.itemsCollection != null)
{
if (this.itemsCollection.Count == 0)
{
int flags = -1610612736;
SafeNativeMethods.SHAutoComplete(new HandleRef(this, this.childEdit.Handle), flags);
}
else if (this.stringSource != null)
{
this.stringSource.RefreshList(this.GetStringsForAutoComplete(this.Items));
}
else
{
this.stringSource = new StringSource(this.GetStringsForAutoComplete(this.Items));
if (!this.stringSource.Bind(new HandleRef(this, this.childEdit.Handle), (int) this.AutoCompleteMode))
{
throw new ArgumentException(SR.GetString( "AutoCompleteFailureListItems "));
}
}
}
}
else
{
try
{
int num4 = 0;
if (this.AutoCompleteMode == AutoCompleteMode.Suggest)
{
num4 |= -1879048192;
}
if (this.AutoCompleteMode == AutoCompleteMode.Append)
{
num4 |= 0x60000000;
}
if (this.AutoCompleteMode == AutoCompleteMode.SuggestAppend)
{
num4 |= 0x10000000;
num4 |= 0x40000000;
}
SafeNativeMethods.SHAutoComplete(new HandleRef(this, this.childEdit.Handle), ((int) this.AutoCompleteSource) | num4);
}
catch (SecurityException)
{
}
}
}
else if (reset)
{
int flags = -1610612736;
SafeNativeMethods.SHAutoComplete(new HandleRef(this, this.childEdit.Handle), flags);
}
}
}