===CCheckListBox和注册表结合的应用=====

来源:互联网 发布:数控机床编程固定循环 编辑:程序博客网 时间:2024/05/21 06:41

            随着上网次数越来越多,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







原创粉丝点击