VC中实现历史记录的全面清除

清除历史记录的文章很多,但是一般都不够全面。作者经过整理和收集一些资料,加以融合。得到了一个较全面的历史记录清除方法。

前言:

在本人用完计算机之后,往往不希望别人发现你做过什么,和浏览过什么网址。(特别是和多人共用一台机子时)。当然,你可以手工清理那些记录。 但那是多么繁杂的一件事啊。 我想没人愿意那样做。于是,我想到用一个软件来一次性完成上述工作。

清除历史记录的文章很多,但是一般都不够全面。本人经过整理和收集一些资料,加以融合。得到了一个较全面的历史记录清除方法。

在这里要指出代码能完成,要特别感谢朋友 xzhang左图便是本文例子程序的运行效果图,我们可以从中看到该例子具体能实现的清除内容。

大小:17K

下面我们通过代码看看具体是如何实现的。

首先: 在  stdafx.h中要加入: #include "atlbase.h"

设置->Link  要引入库 :  Wininet.lib shlwapi.lib 

//在对话框的头文件中加入:

01.#include "wininet.h"

02.#include "UrlHist.h"

03. 

04.#define SWEEP_BUFFER_SIZE 10000

05. 

06.public:

07. 

08.enum DEL_CACHE_TYPE //要删除的类型。

09.{

10.File,//表示internet临时文件

11.Cookie //表示Cookie

12.};

//以下为一些辅助函数 ( 辅助函数的具体实现参见源代码中.限于篇幅不再给出 )

01.BOOL DeleteUrlCache(DEL_CACHE_TYPE type);

02.BOOL EmptyDirectory(LPCTSTR szPath, BOOL bDeleteDesktopIni = FALSE, BOOLbWipeIndexDat = FALSE);//清空一个目录

03.BOOL IsWindowsNT();//判断系统

04.BOOL IsWindows2k();

05.BOOL GetUserSid(PSID* ppSid);

06.void GetSidString(PSID pSid, LPTSTR szBuffer);

07.BOOL GetOldSD(HKEY hKey, LPCTSTR pszSubKey, BYTE** pSD);

08.BOOL CreateNewSD(PSID pSid, SECURITY_DESCRIPTOR* pSD, PACL* ppDacl);

09.BOOL RegSetPrivilege(HKEY hKey, LPCTSTR pszSubKey, SECURITY_DESCRIPTOR* pSD,BOOL bRecursive);

10.BOOL WipeFile(LPCTSTR szDir, LPCTSTR szFile);

//现在我们可以分别实现每项清除功能。

1、清除IE临时文件

1.TCHAR szPath[MAX_PATH];

2.DeleteUrlCache(File);

3.if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_INTERNET_CACHE, FALSE))

4.//得到临时目录,并清空它.

5.EmptyDirectory(szPath);

6.}

清除IE临时文件的另外一个途径是直接调用Wininet函数,请看下面用于清除IE临时文件的函数

01.BOOL DelTempFiles()

02.{

03.BOOL bResult = FALSE;

04.BOOL bDone = FALSE;

05.LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL; 

06. 

07.DWORD  dwTrySize, dwEntrySize = 4096; // start buffer size   

08.HANDLE hCacheDir = NULL;   

09.DWORD  dwError = ERROR_INSUFFICIENT_BUFFER;

10. 

11.do

12.{                              

13.switch (dwError)

14.{

15.// need a bigger buffer

16.case ERROR_INSUFFICIENT_BUFFER:

17.delete [] lpCacheEntry;           

18.lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) newchar[dwEntrySize];

19.lpCacheEntry->dwStructSize = dwEntrySize;

20.dwTrySize = dwEntrySize;

21.BOOL bSuccess;

22.if (hCacheDir == NULL)               

23. 

24.bSuccess = (hCacheDir

25.= FindFirstUrlCacheEntry(NULL, lpCacheEntry,

26.&dwTrySize)) != NULL;

27.else

28.bSuccess = FindNextUrlCacheEntry(hCacheDir, lpCacheEntry, &dwTrySize);

29. 

30.if (bSuccess)

31.dwError = ERROR_SUCCESS;   

32.else

33.{

34.dwError = GetLastError();

35.dwEntrySize = dwTrySize; // use new size returned

36.}

37.break;

38. 

39.// we are done

40.case ERROR_NO_MORE_ITEMS:

41.bDone = TRUE;

42.bResult = TRUE;               

43.break;

44. 

45.// we have got an entry

46.case ERROR_SUCCESS:                      

47. 

48.// don''''''''''''''''t delete cookie entry

49.if (!(lpCacheEntry->CacheEntryType & COOKIE_CACHE_ENTRY))               

50. 

51.DeleteUrlCacheEntry(lpCacheEntry->lpszSourceUrlName);

52. 

53.// get ready for next entry

54.dwTrySize = dwEntrySize;

55.if (FindNextUrlCacheEntry(hCacheDir, lpCacheEntry, &dwTrySize))

56.dwError = ERROR_SUCCESS;         

57. 

58.else

59.{

60.dwError = GetLastError();

61.dwEntrySize = dwTrySize; // use new size returned

62.}                   

63.break;

64. 

65.// unknown error

66.default:

67.bDone = TRUE;               

68.break;

69.}

70. 

71.if (bDone)

72.{  

73.delete [] lpCacheEntry;

74.if (hCacheDir)

75.FindCloseUrlCache(hCacheDir);        

76. 

77.}

78.while (!bDone);

79.return bResult;

80.}

2、Cookie的清除

1.TCHAR szPath[MAX_PATH];

2.DeleteUrlCache(Cookie);

3.if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_COOKIES, FALSE))

4.{//得到目录,并清空

5.EmptyDirectory(szPath);

6.}

3、浏览器地址栏历史地址的清除

1.SHDeleteKey(HKEY_CURRENT_USER,

2._T("Software\\Microsoft\\Internet Explorer\\TypedURLs"));

4、清除表单自动完成历史记录

01.CString sKey;

02.DWORD dwRet;

03. 

04.if (IsWindows2k() || IsWindowsNT())//先判断系统

05.{

06.CString sBaseKey;

07.SECURITY_DESCRIPTOR NewSD;

08.BYTE* pOldSD;

09.PACL pDacl = NULL;

10.PSID pSid = NULL;

11.TCHAR szSid[256];

12.if (GetUserSid(&pSid))

13.{

14.//get the hiden key name

15.GetSidString(pSid, szSid);

16. 

17.sKey = _T("Software\\Microsoft\\Protected Storage System Provider\\");

18.sKey += szSid;

19. 

20.//get old SD

21.sBaseKey = sKey;

22.GetOldSD(HKEY_CURRENT_USER, sBaseKey, &pOldSD);

23. 

24.//set new SD and then clear

25.if (CreateNewSD(pSid, &NewSD, &pDacl))

26.{

27.RegSetPrivilege(HKEY_CURRENT_USER, sKey, &NewSD, FALSE);

28. 

29.sKey += _T("\\Data");

30.RegSetPrivilege(HKEY_CURRENT_USER, sKey, &NewSD, FALSE);

31. 

32.sKey += _T("\\e161255a-37c3-11d2-bcaa-00c04fd929db");

33.RegSetPrivilege(HKEY_CURRENT_USER, sKey, &NewSD, TRUE);

34. 

35.dwRet = SHDeleteKey(HKEY_CURRENT_USER, sKey);

36.}

37. 

38.if (pDacl != NULL)

39.HeapFree(GetProcessHeap(), 0, pDacl);

40. 

41.//restore old SD

42.if (pOldSD)

43.{

44.RegSetPrivilege(HKEY_CURRENT_USER, sBaseKey,

45.(SECURITY_DESCRIPTOR*)pOldSD, FALSE);

46.delete pOldSD;

47.}

48.}

49.if (pSid)

50.HeapFree(GetProcessHeap(), 0, pSid);

51.}

52. 

53.//win9x

54.DWORD dwSize = MAX_PATH;

55.TCHAR szUserName[MAX_PATH];

56.GetUserName(szUserName, &dwSize);

57. 

58.sKey = _T("Software\\Microsoft\\Protected Storage System Provider\\");

59.sKey += szUserName;

60.sKey += _T("\\Data\\e161255a-37c3-11d2-bcaa-00c04fd929db");

61.dwRet = SHDeleteKey(HKEY_LOCAL_MACHINE, sKey);

5、清除自动密码历史记录

1.SHDeleteKey(HKEY_CURRENT_USER,

2._T("Software\\Microsoft\\Internet Explorer\\IntelliForms"));

6、清收藏夹中的内容

1.TCHAR szPath[MAX_PATH];

2.if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_FAVORITES, FALSE))

3.//得到目录,并清空

4.EmptyDirectory(szPath);

5.}

7、清RAS自动拨号历史记录

1.SHDeleteKey(HKEY_CURRENT_USER,

2._T("Software\\Microsoft\\RAS Autodial\\Addresses"));

8、清系统临时文件夹

1.TCHAR szPath[MAX_PATH];

2.if (GetTempPath(MAX_PATH, szPath))//得到系统临时目录

3.{

4.EmptyDirectory(szPath, TRUE);

5.}

9、清空回收站

1.SHEmptyRecycleBin(NULL, NULL, 

2. 

3.SHERB_NOCONFIRMATION | SHERB_NOPROGRESSUI | SHERB_NOSOUND);

10、清除"运行"中的自动匹配历史记录

1.SHDeleteKey(HKEY_CURRENT_USER,

2._T("Software\\Microsoft\\Windows\\

3.CurrentVersion\\Explorer\\RunMRU"));

11、清"文档"中的历史记录

1.TCHAR szPath[MAX_PATH];

2.if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_RECENT, FALSE))

3.{

4.EmptyDirectory(szPath);

5.}

6.SHDeleteKey(HKEY_CURRENT_USER,

7._T("Software\\Microsoft\\Windows\\CurrentVersion

8.\\Explorer\\RecentDocs"));

12、清除上次登陆用户记录

01.SHDeleteValue(HKEY_CURRENT_USER,

02._T("Software\\Microsoft\\Windows NT\\

03.CurrentVersion\\Winlogon"),

04._T("DefaultUserName"));

05.SHDeleteValue(HKEY_CURRENT_USER,

06._T("Software\\Microsoft\\Windows NT\\

07.CurrentVersion\\Winlogon"),

08._T("AltDefaultUserName"));

09.SHDeleteValue(HKEY_LOCAL_MACHINE,

10._T("Software\\Microsoft\\Windows\\

11.CurrentVersion\\Winlogon"),

12._T("DefaultUserName"));

13、清除"查找文件"自动匹配历史记录

01.SHDeleteKey(HKEY_CURRENT_USER,

02._T("Software\\Microsoft\\Windows\\

03.CurrentVersion\\Explorer\\Doc Find Spec

04.MRU"));

05.SHDeleteKey(HKEY_CURRENT_USER,

06._T("Software\\Microsoft\\Internet Explorer

07.\\Explorer Bars\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}

08.\\ContainingTextMRU"));

09.SHDeleteKey(HKEY_CURRENT_USER,

10._T("Software\\Microsoft\\Internet Explorer

11.\\Explorer Bars\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}

12.\\FilesNamedMRU"));

14、清除"查找计算机"自动匹配历史记录

1.SHDeleteKey(HKEY_CURRENT_USER,

2._T("Software\\Microsoft\\Windows\\CurrentVersion

3.\\Explorer\\FindComputerMRU"));

4.SHDeleteKey(HKEY_CURRENT_USER,

5._T("Software\\Microsoft\\Internet Explorer\\Explorer Bars

6.\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}

7.\\ComputerNameMRU"));

15、清除网络联接历史记录

1.TCHAR szPath[MAX_PATH];

2.if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_NETHOOD, FALSE))

3.//得到目录,并清空

4.EmptyDirectory(szPath);

5.}

16、清远程登录历史记录

01.CString sKey;

02.for (int i=1; i<=8; i++)

03.{

04.sKey.Format(_T("Machine%d"), i);

05.SHDeleteValue(HKEY_CURRENT_USER,

06._T("Software\\Microsoft\\Telnet"), sKey);

07. 

08.sKey.Format(_T("Service%d"), i);

09.SHDeleteValue(HKEY_CURRENT_USER,

10._T("Software\\Microsoft\\Telnet"), sKey);

11. 

12.sKey.Format(_T("TermType%d"), i);

13.SHDeleteValue(HKEY_CURRENT_USER,

14._T("Software\\Microsoft\\Telnet"), sKey);

15.}

16.SHDeleteValue(HKEY_CURRENT_USER,

17._T("Software\\Microsoft\\Telnet"), _T("LastMachine"));

18.SHDeleteValue(HKEY_CURRENT_USER,

19._T("Software\\Microsoft\\Telnet"), _T("LastService"));

20.SHDeleteValue(HKEY_CURRENT_USER,

21._T("Software\\Microsoft\\Telnet"), _T("LastTermType"));

17、清浏览网址历史记录

下面这个函数可以用于清除网址历史记录

01.#include "SHLGUID.H"

02.HRESULT ClearHistory()

03.{

04.HRESULT hr;

05.CoInitialize(NULL);

06.{

07.IUrlHistoryStg2* pUrlHistoryStg2 = NULL;

08.hr= CoCreateInstance(CLSID_CUrlHistory,NULL,1, IID_IUrlHistoryStg2,(void**)&pUrlHistoryStg2);

09.if (SUCCEEDED(hr))

10.{        

11.hr = pUrlHistoryStg2->ClearHistory();

12.pUrlHistoryStg2->Release();

13.}

14.}

15.CoUninitialize();

16.return hr;

17.}

// 如果上面代码不能清

// 则有下面的,不完美,但能工作.

01.TCHAR szPath[MAX_PATH];

02.GetWindowsDirectory(szPath, MAX_PATH);

03._tcscat(szPath, _T("\\History"));

04.EmptyDirectory(szPath, FALSE, TRUE);

05. 

06.if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_HISTORY, FALSE))

07.{

08.EmptyDirectory(szPath, FALSE, TRUE);

09.}

猜你喜欢

转载自blog.csdn.net/jiangbb8686/article/details/89112377