随着上网次数越来越多,IE地址栏中留下大量的历史网址,感觉很不爽,于是决心写一个清除IE地址栏的应用程序,随说有“上网助手”,但它要在能上网时才起作用,我想在不能上网时来对系统进行清理,于是写了一个叫IEURLEnder---IE地址终结者 的程序。
首先介绍一下清除IE地址栏的原理。
大家知道,我们在机器上的所有操作,注册表中都有纪录。IE也不例外。当在IE地址栏中输入网址时,就被系统记载在注册表中。具体是在 HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/TypedURLs 下。如果将 TypedURLs 下的所有键值删除掉,就可起到清除IE地址栏历史纪录的作用,但手工修改注册表是比较麻烦的。尤其是当记录数目很大时,直接打开注册表删除不是一件令人愉快地工作。当然,这样做也不失为是一种办法。
以上介绍的就是该程序的工作原理。
接下来介绍界面上的事。
我的想法是在界面上列出所有的IE地址栏历史纪录来,供选择性删除。但Visual C++ 6.0 又不像Visual Studio .Net中那样提供CCheckListBox这样一个带CheckBox的ListBox 供程序员使用。但是Visual C++ 6.0为程序员提供了一个可扩展的CCheckListBox类,CCheckListBox类是从CListBox继承来的,所以前者具备后者的属性和方法,同时CChcekListBox又有它自己独有的方法,如GetCheck(int Index)和SetCheck(int Index,BOOL check) 等方法。这就使得用户可以在界面中做出带CheckBox的ListBox 来。我这个程序就是这样做的。
如何实现的呢?
1)创建一个基于Dialogue的应用程序。
2)在窗体上放入一个List Box,ID设为ID_List 。
3)通过ClassWizard给程序添加变量,在给List Box 添加变量时,变量类型选择为CListBox Control 类型,变量名为m_List。
4)在该窗体的.h文件中找到m_List 的定义处:
// Dialog Data
//{{AFX_DATA(CIEURLEnderDlg)
enum { IDD = IDD_IEURLENDER_DIALOG };
//CListBox m_List; //将这里改为下面一行
CCheckListBox m_List;
CButton m_SelectAll;
CButton m_DeleSelected;
CButton m_CancelAll;
//}}AFX_DATA
这样就能在界面上出现带CheckBox的ListBox 来。
(由于这里不能贴图,所以不能直观感受一下,建议版主能让所有发表文章的人能贴图,以便读者能有一个直观的感受 ,呵呵)
程序通过在OnInitDialog()中来初始化ListBox。
BOOL CIEURLEnderDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
/***************************///
HKEY hKey=NULL;
HKEY hRootKey=HKEY_CURRENT_USER;
LPCTSTR SubKey = "Software//Microsoft//Internet Explorer//TypedURLs";
BOOL m_bError=RegOpenKeyEx(hRootKey, SubKey, 0,KEY_ALL_ACCESS, &hKey);
if (m_bError != ERROR_SUCCESS)
{
RegCloseKey(hKey);
MessageBox("Open key error");
exit(0);
}
//
CString m_skey="";
CString m_sURL="";
DWORD dwType = REG_SZ;
DWORD dwSize = 255;
//_TCHAR
char *sz=NULL;
BOOL m_bQueryError=FALSE;
for(int i=1;i<20;i++) //这假设最多19个纪录,读者可以写出更好的程序来枚举所有纪录
{
m_sURL="";
sz=(char *)malloc(255*sizeof(char));
dwSize = 255;
m_skey.Format("url%d", i);
//读取URL
m_bError =RegQueryValueEx(hKey, LPCTSTR(m_skey), NULL,&dwType, (LPBYTE)sz, &dwSize);
if (m_bError != ERROR_SUCCESS)
{
RegCloseKey(hKey);
m_bQueryError=TRUE;
break;
}
m_sURL=(CString)sz;
if (!m_sURL.IsEmpty())
m_List.InsertString(i-1, m_sURL); //插入到CCheckListBox中
free(sz);
}
if(!m_bQueryError)
// MessageBox("query error");
// else
RegCloseKey(hKey);
///
return TRUE; // return TRUE unless you set the focus to a control
}
另外,我在界面上加了4个Button ,分别是“选中所有纪录”、“取消全选”、“删除选中项”、“退出”。
“选中所有纪录”的响应代码如下:
void CIEURLEnderDlg::OnSelectAll()
{
// TODO: Add your control notification handler code here
int m_iURLNum=m_List.GetCount(); //获得CCheckListBox中纪录条数
for(int i=0;i<m_iURLNum;i++)
{
m_List.SetCheck(i,TRUE); //将每个纪录设成选中状态
}
}
“取消全选”的响应代码:
void CIEURLEnderDlg::OnCancelAll()
{
// TODO: Add your control notification handler code here
int m_iURLNum=m_List.GetCount();
for(int i=0;i<m_iURLNum;i++)
{
if(m_List.GetCheck(i)==TRUE) //如果是选中,
m_List.SetCheck(i,FALSE); //将状态设为不选中
}
}
“删除选中项” 的响应代码:
void CIEURLEnderDlg::OnDeleSelected()
{
// TODO: Add your control notification handler code here
HKEY hKey=NULL;
HKEY hRootKey=HKEY_CURRENT_USER;
LPCTSTR SubKey = "Software//Microsoft//Internet Explorer//TypedURLs";
//首先打开注册表响应键
BOOL m_bError=RegOpenKeyEx(hRootKey, SubKey, 0,KEY_ALL_ACCESS, &hKey);
if (m_bError != ERROR_SUCCESS)
{
RegCloseKey(hKey);
MessageBox("Open key error");
exit(0);
}
//
//删除
int m_iURLNum=m_List.GetCount();
for(int i=m_iURLNum;i>=0;i--)
//注意:循环变量要从大到小,因为你删除一个键后,在CChekListBox 中它后面的项的索引就会自动减1 ,再用GetCheck(i)来判断时就会出错。
{
if(m_List.GetCheck(i-1)==TRUE)
{
//
m_List.DeleteString(i);
//
CString m_sURL="";
m_sURL.Format("url%d",i);
//从注册表中删除该键
RegDeleteValue(hKey,m_sURL);
}
}
RegCloseKey(hKey);
}
好了,程序主要的地方说完了,希望能对一些朋友有些帮助。
===================================
我还想把它做的更好些,然后做成一个插件,像3721的上网助手一样,成为IE的一个Toolbar ,希望高手们指点。
需要源代码的朋友,告诉我你的E-mail。
我的E-mail:banrenma23@yahoo.com.cn
MSN : Honwei_Liu @hotmail.com