随着上网次数越来越多,IE地址栏中留下大量的历史网址,感觉很不爽,于是决心写一个清除IE地址栏的应用程序,随说有“上网助手”,但它要在能上网时才起作用,我想在不能上网时来对系统进行清理,于是写了一个叫

随着上网次数越来越多,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 ,希望高手们指点。

(转载)http://hi.baidu.com/mathbox59/blog/item/1936960b283edf88d0581b3f.html


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值