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

10 篇文章 0 订阅

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

前言:

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

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

在这里要指出代码能完成,要特别感谢朋友 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. }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值