65.9K
CodeProject 正在变化。 阅读更多。
Home

Internet Explorer 工具栏创建

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.10/5 (47投票s)

2008年4月17日

CPOL

5分钟阅读

viewsIcon

147789

downloadIcon

2753

如何创建自己的 Internet Explorer 插件的基础代码和说明。

引言

本文提供了创建专业 Internet Explorer 工具栏的基础代码。
虽然其他文章为工具栏概念提供了良好的入门,但它们仍然缺少专业应用程序所需的某些部分,以及支持 **Vista** 和 **XP** 的外观和感觉,以及完整的设置。
本文最适合想要在 5 分钟内获得一个可运行项目的新手。
我仍然建议那些想要更深入了解 **BandObject** 组件内部原理的读者进一步阅读相关文章。

背景

在我开发我的 密码管理器 工具栏时,我开始在网络上寻找代码示例和文章。我找到了一些非常有用的(比如 **Pavel Zolnikov 的 文章),它们在基本的工具栏实现方面给了我很大的帮助。

但随后我发现了一些问题,例如:
- 工具栏在 IE7 中不显示
- Vista 中的工具栏问题以及 Vista 上糟糕的外观和感觉
- 安装问题
- 安装后工具栏不显示等等……

由于我不得不解决所有这些问题才能使其专业运行,我花了几天时间查找解决这些问题的评论和论坛。

我在这里努力为所有想要体验创建工具栏的乐趣而又不想处理繁琐的底层细节的初学者和专家们,提供最“干净”的工具栏实现。

仍然存在一些小问题,我希望在一些热情的编码人员的帮助下,我们能够解决所有问题并提供完美的 Toolbar 类。

Using the Code

只需继承 `Toolbar` 类。您可以将其重命名为您想要的任何名称。

我在示例中提供了一个简单的按钮和标签。它是一个常规的 WinForm `ToolStrip`,因此您可以在此处放置所有 ToolStrip 项。

访问浏览器和 DOM

使用 `Explorer` 属性访问 `WebBrowserClass`。为简单起见,我添加了 `Navigate(string url)` 和 `NewWindow(string url)` 方法。

“Constants”类

class Constants 
{

  public const string ToolbarName = "Sample Toolbar"; 

  public const string ToolbarHelpText = "Sample Toolbar Help Text";   

  public const string ToolbarGUID = "4D02E7E6-5930-4b51-B9B0-9F21B3789400"; 


  public const int ToolBarWidth = 160; 

  public const string Assembly = "Toolbar, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=f2e11770db40f5b0"; 

}

您**必须**为您的工具栏创建一个新的 GUID,而不是使用 `oolbarGUID` 中提供的。

建议使用不同的 .snk 文件(ToolbarKey.snk)为已发布的程序集签名。在这种情况下,**PublicKeyToken** 将会更改,因此您需要在 `Assembly` const 字符串中进行修订。

要从 dll 中提取 public key token,您可以使用 VS2005 工具中的 **sn -T**。

调试、重新生成和开发

为了调试工具栏,您可以删除构造函数中的注释。

         public Toolbar() 
     {
            //Debugger.Launch();

        ......

或者,您可以使用 VS2005 IDE 的“附加到进程”选项,然后附加到 IE。

当您更新工具栏的代码时,您**无需**卸载和重新安装它,只需在 GAC 中重新注册即可。

前往 开始 -> 设置 -> 控制面板 -> 管理工具

选择“Microsoft .NET Framework 2.0 配置”。

右键单击“程序集缓存”,选择“添加”,然后添加工具栏 dll。

关注点

使用 BHO 在安装后显示工具栏

BHO(浏览器帮助对象)类似于 Toolbar(BandObject),但缺少 GUI 功能。

我仅使用 BHO 来在安装后立即显示工具栏。

在设置中,我通过将其添加到注册表中,将 BandObject 注册为 **BHO**。

     RegistryKey bhoKey = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft
\Windows\CurrentVersion\Explorer\Browser Helper Objects\" + guid); 
     bhoKey.SetValue("NoExplorer", 1, RegistryValueKind.DWord);    

首次调用 BHO 对象的 `SetSite` 方法时,会调用 `ShowToolbar` 方法。

       
public virtual void SetSite(object pUnkSite) 
{ 
  if (pUnkSite is IInputObjectSite) { 
     _SetSite(pUnkSite); 
  }
  else if (pUnkSite is InternetExplorer) 
  {
    // this code is executed by the BHO in order to show the toolbar immediatly 
    // after the installation 
    ShowToolBar(pUnkSite); 
  } 
}
  

`ShowToolbar` 负责使用 `ShowBrowserBar` 显示工具栏。

方法,然后从注册表中删除 BHO,因为它已经没有用了。

        
Registry.LocalMachine.DeleteSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion
\Explorer\Browser Helper Objects\{" + Constants.ToolbarGUID + "}");
    

根据主题绘制工具栏背景

当我第一次在 Vista 上测试工具栏时,它有一个非常难看的灰色背景,而不是 IE7 或 Vista 的平滑渐变样式。我深入研究以找到解决方案,并找到了很棒的 “Geer's Blog”,它给了我想要的答案。

负责继承工具栏背景的代码片段如下:

[DllImport("uxtheme", ExactSpelling = true)] 
public extern static Int32 DrawThemeParentBackground(IntPtr hWnd, IntPtr hdc,
 ref Rectangle pRect);

protected override void OnPaintBackground(PaintEventArgs e) 
{
 if (this.BackColor == Color.Transparent) 
 {
   IntPtr hdc = e.Graphics.GetHdc(); 
   Rectangle rec = new Rectangle(e.ClipRectangle.Left, e.ClipRectangle.Top,
 e.ClipRectangle.Width, e.ClipRectangle.Height);
   DrawThemeParentBackground(this.Handle, hdc, ref rec);
   e.Graphics.ReleaseHdc(hdc);
 }
 else 
 {
  base.OnPaintBackground(e); 
 }
}      

工具栏位置

我承认我还没有完美地实现它,即能够将工具栏放置在我喜欢的任何地方。在 XP 上它工作得很好,但后来发现它在 Vista 上效果不佳。我也尝试通过实现 `IPersistStream` 来记住工具栏的位置,但它不起作用。

最终,我妥协了一个静态工具栏,它在 Vista 和 XP 上都运行良好。

在 GetBandInfo 中负责位置和其他布局行为的标志是:

  dbi.dwModeFlags = DBIMF.NORMAL | DBIMF.VARIABLEHEIGHT | DBIMF.ALWAYSGRIPPER; 
 

进程范围

所有使用“新窗口”或“新标签页”创建的 BandObjects 都位于同一进程中,因此您可以使用静态成员在它们之间进行通信。为了方便起见,我在进程中添加了一个所有工具栏的静态列表:`ToolbarsCollection`。

我在我的 密码管理器 中使用了此集合来在工具栏之间同步登录/登出和其他操作。

从桌面或快速启动栏启动 IE 会创建新进程,因此在这种情况下,该集合将不起作用。

关于设置

我使用了 VS2005 提供的非常基础的安装项目。几乎所有负责注册表操作的代码(COM 注册、BandObject 注册和 BHO 注册)都在 `ToolbarInstaller` 类中完成,该类继承自 `System.Configuration.Install.Installer`。

我在设置中做的另一件事是通过显式选择文件系统中的 GAC 文件夹来在 **GAC** 中注册。我可以使用 `Publish` 类通过代码将工具栏注册到 GAC,但这超出了范围。

© . All rights reserved.