IE修改

//----------------------------------------------------------------------------------------
将应用程序加入到ie工具栏
  1 运行输入(gpedit.msc) 启用组策略
  2 选择本地计算机策略->用户配置->Internet Explorer维护->浏览器用户界面
  3 浏览器工具栏自定义(双击)出现浏览器工具栏自定义对话框
  4 在按钮选项卡中单击添加 出现浏览器工具栏按钮信息对话框
  5 在工具栏标题内填入一个自己喜欢的名字 在工具栏中输入应用程序路径,接下来选择工具栏颜色
    图标和工具栏灰度图标路径,单击浏览 定位到一个图标文件即可
  6 单击确定回到主窗口

工具栏图标在注册表中的位置是:"HKEY_LOCAL_MACHINE/Softwaret/Microsoft/Internet Explorer/Extensions"

双击ID
ButtonText:自定义按钮的显示文本
Default Visible:控制自定义按钮是否可见,一般为YES
Exec:自定义按钮执行的目标,可以为执行程序或超文本连接
HotIcon:鼠标一到按钮上的显示图标
Icon:定义一般情况的图标
MenuText:定义了鼠标指向浏览器工具栏菜单中的图标,在浏览器状态栏里面显示内容
MenuStatusBar:定义了当鼠标指向IE工具菜单中的相关选项时,在状态栏所显示的相关说明
//----------------------------------------------------------------------------------------


用程序实现:(2,4,5步骤)
1得到应用程序的路径和文件名
/*2获得程序的图标
HICON smalls;//小图标
HICON larges;//大图标
ExtractIconEx(LPCSTR(filename),0,&larges,&smalls,1);//获取应用程序中的图标
*/
/*3得到文件的CLSID
CLSID pclsid;
unsigned short *a=new unsigned short[pathname.GetLength()];
for(int i=0;i<filename.GetLength();i++)
{
a[i]=(unsigned short)(filename[i]);
}

if(GetClassFile(a,&pclsid)==MK_E_CANTOPENFILE)
{
}*/
4 调用GenerateRadomName产生键值
GenerateRadomName(CString &valuename)
{

 char a[3];
 int i=0;
 valuename="{";

 srand( (unsigned)time( NULL ) ); //以时间为种子

 while(i<8)
 {
  i++;
  a[0]=rand()%('9'-'0'+1)+'0';
  a[1]=rand()%('z'-'a'+1)+'a';
  a[2]=rand()%('Z'-'A'+1)+'A';
  valuename=valuename+CString(a[rand()%3]);
 }
 
 valuename+="-";
 i=0;
 while(i<4)
 {
  i++;
  a[0]=rand()%('9'-'0'+1)+'0';
  a[1]=rand()%('z'-'a'+1)+'a';
  a[2]=rand()%('Z'-'A'+1)+'A';
  valuename=valuename+CString(a[rand()%3]);
 }
 valuename+="-";
 i=0;
 while(i<4)
 {
  i++;
  a[0]=rand()%('9'-'0'+1)+'0';
  a[1]=rand()%('z'-'a'+1)+'a';
  a[2]=rand()%('Z'-'A'+1)+'A';
  valuename=valuename+CString(a[rand()%3]);
 }
 valuename+="-";
 i=0;
 while(i<4)
 {
  i++;
  a[0]=rand()%('9'-'0'+1)+'0';
  a[1]=rand()%('z'-'a'+1)+'a';
  a[2]=rand()%('Z'-'A'+1)+'A';
  valuename=valuename+CString(a[rand()%3]);
 }

 valuename+="-";
 i=0;
 while(i<12)
 {
  i++;
  a[0]=rand()%('9'-'0'+1)+'0';
  a[1]=rand()%('z'-'a'+1)+'a';
  a[2]=rand()%('Z'-'A'+1)+'A';
  valuename=valuename+CString(a[rand()%3]);
 }
 valuename+="}";
}

5想上面的信息写入注册表
AddEventSource(CString keyname, CString pathname, CString filename)
{
 HKEY hk;
 CString buffer;
 CString CLSID="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}";

 //创建一个子键,子键名称是keyname
 if(RegCreateKey(HKEY_LOCAL_MACHINE,"Software//Microsoft//Internet Explorer//Extensions//"+keyname
  ,&hk)!=ERROR_SUCCESS)
 {
  AfxMessageBox("Cann't Create Key!");
  return ;
 }

 //Button text 键值设置,显示按钮文本
 buffer="Button Text";
 if(RegSetValueEx(hk,// subkey handle
                buffer,// value name
       0,// must be zero
       REG_SZ,  // value type
                (CONST BYTE*)((LPCSTR)filename),// pointer to value data
       filename.GetLength() // length of value data
       )!=ERROR_SUCCESS)
 {
  AfxMessageBox("Cannot Set Value");
 }

 //CLSID
    if (RegSetValueEx(hk,             // subkey handle
            "CLSID",       // value name
            0,                        // must be zero
            REG_SZ,            // value type
            (CONST BYTE *)((LPCSTR)CLSID),           // pointer to value data
            CLSID.GetLength())!=ERROR_SUCCESS)       // length of value data
 {
  AfxMessageBox("Cannot Set Value");
 }

 buffer="Yes";
    if (RegSetValueEx(hk,  // subkey handle
            "Default visible",   // value name
            0,     // must be zero
            REG_SZ,   // value type
            (CONST BYTE *)((LPCSTR)buffer), // pointer to value data
            buffer.GetLength())!=ERROR_SUCCESS)    // length of value data
 {
  AfxMessageBox("Cannot Set Value !");
 }

 // Exec
    if (RegSetValueEx(hk,  // subkey handle
            "Exec",   // value name
            0,     // must be zero
            REG_SZ,   // value type
            (CONST BYTE *)((LPCSTR)pathname), // pointer to value data
            pathname.GetLength())!=ERROR_SUCCESS)    // length of value data
 {
  AfxMessageBox("Cannot Set Value !");
 }

 // HotIcon
    if (RegSetValueEx(hk,  // subkey handle
            "HotIcon",   // value name
            0,     // must be zero
            REG_SZ,    // value type
            (CONST BYTE *)((LPCSTR)(pathname+",001")), // pointer to value data
            pathname.GetLength())!=ERROR_SUCCESS)    // length of value data
 {
  AfxMessageBox("Cannot Set Value !");
 }
 
 // Icon
    if (RegSetValueEx(hk,  // subkey handle
            "Icon",   // value name
            0,     // must be zero
            REG_SZ,   // value type
            (CONST BYTE *)((LPCSTR)(pathname+",002")), // pointer to value data
            pathname.GetLength())!=ERROR_SUCCESS)    // length of value data
 {
  AfxMessageBox("Cannot Set Value !");
 }


 // MenuStatusBar
    if (RegSetValueEx(hk,  // subkey handle
            "MenuStatusBar",   // value name
            0,     // must be zero
            REG_SZ,   // value type
            (CONST BYTE *)((LPCSTR)filename), // pointer to value data
            filename.GetLength())!=ERROR_SUCCESS)    // length of value data
 {
  AfxMessageBox("Cannot Set Value !");
 }

 // MenuText
    if (RegSetValueEx(hk,  // subkey handle
            "MenuText",   // value name
            0,     // must be zero
            REG_SZ,   // value type
            (CONST BYTE *)((LPCSTR)filename), // pointer to value data
            filename.GetLength())!=ERROR_SUCCESS)    // length of value data
 {
  AfxMessageBox("Cannot Set Value !");
 }
 RegCloseKey(hk);
}
/
超级连接的实现:
因为CStatic本身是没有超链接功能的,采用的方法是从CStatic类中继承一个子类;
子类完成以下功能:
(1):相应鼠标移动消息;
(2):鼠标左键按下消息;
(3):实现对静态文本框种颜色的绘制:
(4):实现Shell功能,启动外部程序;
注意:
1 CStatic类本身无法获得任何鼠标消息,可以利用SetWindowLong函数直接修改窗口风格,这里添加一个一个消息SS_NOTIFY的窗口
2 afx_msg HBRUSH CtlColor(CDC* pDC,UINT nCtlColor);
ON_WM_CTLCOLOR_REFLECT()
HBRUSH CHyperLinker::CtlColor(CDC* pDC,  UINT nCtlColor)
{
 ASSERT(nCtlColor==CTLCOLOR_STATIC);
 DWORD dwStyle=GetStyle();
 if(!(dwStyle&SS_NOTIFY))
 {
  ::SetWindowLong(m_hWnd,GWL_STYLE,dwStyle|SS_NOTIFY);
 }

 HBRUSH hbr=NULL ;
 
 if ((dwStyle & 0xFF) <= SS_RIGHT)
 {
  // Modify the font to be underline
  if (!((HFONT) m_Font))
  {
   LOGFONT lf;
   GetFont()->GetObject(sizeof(lf), &lf);

   lf.lfUnderline = m_bUnderLine;
   m_Font.CreateFontIndirect(&lf);
  }
  pDC->SelectObject(&m_Font);

  //set the text colors
  if(m_bVisited==TRUE)
  {
   pDC->SetTextColor(m_VisitedColor);
//   AfxMessageBox("Click");
  }
  else
  {
   if(m_bAboveControl==TRUE)
   {
    pDC->SetTextColor(m_CoverColor);
//    AfxMessageBox("Above");
   }
   else
   {
    pDC->SetTextColor(this->m_InitColor);
   
   }
  }
  pDC->SetBkMode(TRANSPARENT);
  hbr = (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
 }

 return hbr;
}

3 virtual void PreSubclassWindow();
//修改静态文本框的窗口属性
void CHyperLinker::PreSubclassWindow()
{
 //获得鼠标事件
 DWORD dwStyle = GetStyle();
 ::SetWindowLong(GetSafeHwnd(),GWL_STYLE,dwStyle|SS_NOTIFY);
 CStatic::PreSubclassWindow();
}

4 该变鼠标形状函数:
BOOL CHyperLinker::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
 // TODO: Add your message handler code here and/or call default
 
 HCURSOR  LinkCursor = ::AfxGetApp()->LoadCursor(IDC_CURSOR1);
 ::SetCursor(LinkCursor);
 return TRUE;   //必须包括这句话
 return CStatic::OnSetCursor(pWnd, nHitTest, message);
}

 
//-----------------------
IE收藏夹:
原理:
首先调用Shell API函数SHGetSpecialFolderPath(),其中的CSIDL参数设为CSIDL_FAVORITES,这样获得收藏夹的路径名,接着扫描路径下的所有URL文件并递归的扫描所有文件,然后获取一个字符串列表,记录了刚才所扫描出来的所有URL名称和文件夹名,将这个字符串列表组合成一个菜单栏,最后利用ON_COMMAND_RANGE消息相应用户对收藏夹选项的选择

注意:
afx_msg void OnFavorite(UINT nID);
ON_COMMAND_RANGE(0xe00,0xfff,OnFavorite)
void CMainFrame::OnFavorite(UINT nID)
{
((CMyBrowserxxView*)GetActiveView())->Navigate2(m_astrFavoriteUrls[nID-0xe00],0,NULL);
}
ON_COMMAND_RANGE是一个宏,它可以使得多个命令符号在同一个消息处理函数中的到处理
步骤:
1
CStringArray m_astrFavoriteUrls;//收藏夹字符串列表
int BuildFavoritesMenu(LPCTSTR pszPath,int nStartPos,CMenu *pMenu);
afx_msg void OnFavorite(UINT nID);//选择列表后的消息相应
2 在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)里添加:
 //生成“我的收藏夹”子菜单
 char   path[MAX_PATH];
 CMenu* pMenu;
 //开始消去存在的菜单
 pMenu=GetMenu()->GetSubMenu(4);
 TRACE("%d",pMenu->GetMenuItemCount());
 while(pMenu->DeleteMenu(0, MF_BYPOSITION));/**/

 SHGetSpecialFolderPath(NULL,path,CSIDL_FAVORITES,FALSE);
   
 //添加我的收藏菜单项
 BuildFavoritesMenu(path, 0, pMenu);
3
构建收藏夹菜单的函数
int CMainFrame::BuildFavoritesMenu(LPCTSTR pszPath, int nStartPos, CMenu *pMenu)
{
 CString         strPath(pszPath);
 CString         strPath2;
 CString         str;

 WIN32_FIND_DATA wfd;
 HANDLE          h;

 int             nPos;
 int             nEndPos;
 int             nNewEndPos;
 int             nLastDir;

 TCHAR           buf[400];
 CStringArray    astrFavorites;
 CStringArray    astrDirs;
 CMenu*          pSubMenu;

 // 确定有'//'字符
 if(strPath[strPath.GetLength() - 1] != _T('//'))
  strPath += _T('//');
 strPath2 = strPath;
 strPath += "*.*";
 // 首先扫描 .URL 然后扫描子目录
 h = FindFirstFile(strPath, &wfd);
 if(h != INVALID_HANDLE_VALUE)
 {
  nEndPos = nStartPos;
  do
  {
   //如果是文件 插入到文件夹列表
   //--------------------------------------------------------------------------------------------------------
   //非目录文件,非隐藏属性,非系统属性
   if((wfd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))==0)
   {
    str = wfd.cFileName;
    if(str.Right(4) == _T(".url"))
    {
     // an .URL file is formatted just like an .INI file, so we can
     // use GetPrivateProfileString() to get the information we want
     ::GetPrivateProfileString(_T("InternetShortcut"), _T("URL"),
             _T(""), buf, 400,
             strPath2 + str);
     str = str.Left(str.GetLength() - 4);

     // scan through the array and perform an insertion sort
     // to make sure the menu ends up in alphabetic order
     也就是按一定排序进行插入
     for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
     {
      if(str.CompareNoCase(astrFavorites[nPos]) < 0)
       break;
     }
     astrFavorites.InsertAt(nPos, str);
     m_astrFavoriteUrls.InsertAt(nPos, buf);
     ++nEndPos;
    }
   }
  }while(FindNextFile(h, &wfd));
  FindClose(h);
  //--------------------------------------------------------------------------------------------------------
  //----------------------------------------------------------------------------------------------------------
  // Now add these items to the menu
  for(nPos=nStartPos;nPos<nEndPos;++nPos)
  {
   pMenu->AppendMenu(MF_STRING | MF_ENABLED,0xe00+nPos,astrFavorites[nPos]);
  }
  //--------------------------------------------------------------------------------------------
  nLastDir = 0;
  h = FindFirstFile(strPath, &wfd);
  ASSERT(h != INVALID_HANDLE_VALUE);

  do
  {
   if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//是文件夹
   {
    //忽略当前路径和父路径节点
    if(lstrcmp(wfd.cFileName,_T("."))==0 || lstrcmp(wfd.cFileName,_T(".."))==0)
     continue;

    for(nPos = 0 ; nPos < nLastDir ; ++nPos)
    {
     if(astrDirs[nPos].CompareNoCase(wfd.cFileName) > 0)
      break;
    }

    //创建弹出式菜单
    pSubMenu=new CMenu;
    pSubMenu->CreatePopupMenu();
    //递归找出所有文件
    nNewEndPos = BuildFavoritesMenu(strPath2 + wfd.cFileName, nEndPos, pSubMenu);
    if(nNewEndPos != nEndPos)
    {
     // only intert a submenu if there are in fact .URL files in the subdirectory
     nEndPos = nNewEndPos;
     pMenu->InsertMenu(nPos, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)pSubMenu->m_hMenu, wfd.cFileName);
     pSubMenu->Detach();
     astrDirs.InsertAt(nPos, wfd.cFileName);
     ++nLastDir;
    }
    delete pSubMenu;
   }
  }while(FindNextFile(h,&wfd));
  FindClose(h);
 }
 return nEndPos;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值