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.}

时间: 2025-01-02 15:56:25

VC中实现历史记录的全面清除的相关文章

VC++中开发汇编语言(转)

汇编程序结构 一个显示字符串的汇编程序 程序格式 一.模式定义 二.includelib语句 三.函数声明语句 四.数据和代码部分 Visual C/C++环境 建立工程 汇编程序的调试 一.设置断点 二.内存窗口 三.寄存器窗口 四.监视窗口 常用调试命令 字符串输入.输出 printf sprintf scanf 常用Windows API调用 MessageBox 确定函数的声明语句和库文件 读取CPU标识 WinDbg调试工具 实验题:用MessageBox函数显示CPU信息 源自:ht

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

VC中常见的108个问题

(1) 如何通过代码获得应用程序主窗口的 指针? 主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现. AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED) //使程序最大化. (2) 确定应用程序的路径 Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名. Example: TCHAR exeFullPath[MAX_PATH] // MAX_PATH在API中定义了吧,

浅谈VC++中预编译的头文件放那里的问题分析

用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx.h中的头文件才会有效果.如下: file: stdafx.h // stdafx.h : include file for standard system include files, // or project specific include files that are used freque

深度解析VC中的消息传递机制

摘要:Windows编程和Dos编程,一个很大的区别就是,Windows编程是事件驱动,消息传递的.所以,要学好Windows编程,必须 对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面的分析. 一.什么是消息? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定 义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键 都会使Windows发送一个

VC中LINK 2001 和 LINK 2009 的错误的解决

最近将两个开源C++项目编译成windows版本的时候遇到很多问题,关键是两个项目经过同事的修改之后,一个项目引用了另一个项目,两个项目的头文件中都有一些跨平台的关于数据类型,以及一些通用函数的定义,所以导致有冲突,编译的时候总是报错,报的最多的是“无法解析的外部符号”,经过近3天的折腾总算都通过了,这里是一些总结. 首先,关于VC中的lib,与linux下的静态库是不同的,在VC中编译动态库的时候会生成一个lib和一个对应的dll,使用者在使用的时候需要包含头文件以及连接到该lib,在发布最终

在VC中创建两套资源解决中英文版本发布的问题

原文http://blog.csdn.net/ylforever/article/details/6745611 一.背景 当软件需要发布多个不同语言版本时,对资源编辑的菜单,按钮,对话框大小形状有不同的要求.比如同个单词用中文/英文描述字符长度差异较大,如果这个单词 用作按钮的标题,对按钮的大小要求就不一样.这时可以有两种解决方法:1.通过代码动态调整按钮的大小,较麻烦,也破坏了VC资源编辑所见即所得规则. 2.准备两套资源,编译不同的版本用不同的资源.下面重点描述第二种处理方法的详细步骤.

VC 中 UpdateData() 函数的使用

UpdateData(FALSE)与UpdateData(TRUE)是相反的过程 UpdateData(FALSE)是把程序中改变的值更新到控件中去 UpdateData(TRUE)是把在控件中输入的值更新到你的变量中去 TRUE    ===> 控件    -〉数据成员 FALSE ===>   数据成员 -〉 控件 VC 中 UpdateData() 函数的使用,布布扣,bubuko.com

VC中未分配空间的内存的处理

还是从这个经典的段子说起:手持两把锟斤拷,口中疾呼烫烫烫. 这都是VC中内存没有初始化产生的结果,下面对没有初始化的内存值做一个总结.   DEBUG     RELEASE 全局区 0 0 堆区 CDCDCDCD BAADF00D 栈区 CCCCCCCC 随机值 其中CCCCCCCC 会产生程序断点 还有类似的值 FDFDFDFD  是VC用来标记堆空间的起始位置,可以用来判断越界问题: FEEEFEEE用来在DEBUG 模式下填充已经释放的堆空间.