26、构建轻量级按钮和菜单扩展

构建轻量级按钮和菜单扩展

在网页开发中,为浏览器添加自定义的按钮和菜单扩展可以显著提升用户体验。下面将详细介绍如何在IE浏览器中构建和使用这些轻量级的扩展。

1. 上下文菜单扩展

上下文菜单扩展与使用JavaScript替换整个上下文菜单不同。现代浏览器(如IE)允许开发者通过JavaScript阻止默认上下文菜单的显示。上下文菜单扩展也不同于加速器,这些扩展对本地系统有更多的访问权限,且不是用XML构建的。

开发者可以使用事件处理程序,为特定的网站或应用程序设计自定义的上下文菜单,完全替换浏览器的默认上下文菜单。不过,这些自定义菜单仅在包含它们的网站上显示,其他页面仍显示默认上下文菜单及其扩展。

例如,Google Docs使用自定义菜单,让用户在其网页应用中轻松访问常用命令,而无需安装任何扩展。

2. 添加工具栏按钮

工具栏按钮是可以添加到IE命令栏工具栏(带对象)的图标,用户可以直接从浏览器框架快速访问有用的任务和应用程序。下面详细介绍如何构建、安装和使用这些扩展。

2.1 常见工具栏按钮属性

工具栏按钮通过一组基本的注册表值在IE中定义和加载。这些值可以存储在 HKEY_LOCAL_MACHINE HKEY_CURRENT_USER 项中。所有扩展都位于 Software\Microsoft\Internet Explorer\Extensions 键下;在64位系统中,32位扩展应放在 Software\Wow6432Node\Microsoft\Internet Explorer\Extensions 模拟键下。

以下是一个通过注册表定义基本工具栏按钮的示例:

HKEY_CURRENT_USER\
   Software\
      Microsoft\
         Internet Explorer\
            Extensions\
               {D862829C-9A39-4029-A4CC-2A78C9C1F2F3}\
                  CLSID             (REG_SZ)  = "{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
                  ButtonText        (REG_SZ)  = "My button"
                  Icon              (REG_SZ)  = "C:\\MyIcon.ico"
                  HotIcon           (REG_SZ)  = "C:\\MyHotIcon.ico"
                  Default Visible   (REG_SZ)  = "yes"
                  ...

每个扩展通过父 Extensions 键下的一个键来区分,该键的名称是一个GUID。此键下的每个注册表项代表定义工具栏按钮的一些数据。具体每个值的详细说明如下表所示:
| 名称 | 值类型 | 描述 |
| ---- | ---- | ---- |
| CLSID | REG_SZ | 主IE命令栏(工具栏)的类ID,即CLSID_Shell_ToolbarExtExec |
| ButtonText | REG_SZ | 工具栏图标旁边显示的文本 |
| Icon | REG_SZ | 包含灰度图标的图标文件(包含16×16和24×24格式) |
| HotIcon | REG_SZ | 包含彩色图标的图标文件(包含16×16和24×24格式) |
| Default Visible | REG_SZ | 允许按钮默认显示在工具栏中 |

CLSID 值代表IE命令栏的类ID; ButtonText 是按钮文本; Icon 指向通常为灰度的闲置图标, HotIcon 指向鼠标悬停时使用的彩色图标;为避免缩放,指定的图标应包含16×16和24×24两种尺寸; Default Visible 设置告诉IE默认是否显示该图标。

2.2 使用工具栏按钮运行脚本

工具栏按钮点击时可以启动网页或脚本,还能启动脚本修改当前网页或运行系统命令。

开发者可以通过 Script 注册表值创建启动脚本的扩展。该值的数据是标记或脚本文件的路径,它与常见的工具栏按钮注册表值位于同一键下。

以下是脚本型工具栏按钮的注册表值说明:
| 名称 | 值类型 | 描述 |
| ---- | ---- | ---- |
| Script | REG_SZ | 脚本文件的路径 |

以下是一个安装脚本型工具栏按钮的注册表脚本示例:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\
   {E210FAE5-3322-4DF7-94E2-B134CC624B35}]
"CLSID"="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
"ButtonText"="Launch MSDN"
"Icon"="C:\\ProIeDev\\10\\ToolbarButton\\Script\\MSDN.ico"
"HotIcon"="C:\\ProIeDev\\10\\ToolbarButton\\Script\\MSDN.ico"
"Default Visible"="Yes"
"Script"="C:\\ProIeDev\\10\\ToolbarButton\\Script\\Run.html"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Extensions\
   {1C1E2247-34CA-44B8-BE91-4E0798CAC048}]
"CLSID"="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
"ButtonText"="Launch MSDN"
"Icon"="C:\\ProIeDev\\10\\ToolbarButton\\Script\\MSDN.ico"
"HotIcon"="C:\\ProIeDev\\10\\ToolbarButton\\Script\\MSDN.ico"
"Default Visible"="Yes"
"Script"="C:\\ProIeDev\\10\\ToolbarButton\\Script\\Run.html"

这个注册表脚本同时考虑了32位和64位的IE可执行文件。导入后,它会在标准IE扩展键和 Wow6432Node 注册表模拟键中写入一个工具栏按钮。

Run.html 脚本使用JavaScript在新的IE窗口中启动MSDN(http://msdn.microsoft.com ),其代码如下:

<html>
   <body>
      <script type="text/javascript">

         //  Create a new ActiveX shell object
         var shell = new ActiveXObject("WScript.Shell");

         //  Open up a new instance of IE pointing
         //  to a URL
         shell.run("iexplore.exe " +
                   "http://msdn.microsoft.com"
                   );

      </script>
   </body>
</html>

当IE加载此页面时,JScript引擎会执行页面主体中的JavaScript。创建一个新的 ActiveXObject ,允许脚本访问系统资源和可执行文件。然后打开shell并传递IE可执行文件的命令行和MSDN网页的URL作为参数。

需要注意的是,从工具栏按钮实例化的脚本具有增强的权限,普通网页无法实例化 WScript.Shell 对象或其他高权限对象。

要移除工具栏按钮,只需删除与它关联的所有注册表键和值。以下是移除示例按钮安装时创建的两个键的注册表脚本:

Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\
   {E210FAE5-3322-4DF7-94E2-B134CC624B35}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Extensions\
   {1C1E2247-34CA-44B8-BE91-4E0798CAC048}]

移除按钮的操作在关闭所有IE实例后生效。可以使用批处理文件、脚本或二进制文件来写入或删除这些注册表值。

2.3 通过工具栏按钮启动可执行文件

工具栏按钮可以直接执行命令或批处理文件,而不仅仅是简单的脚本。可执行工具栏按钮通过 Exec 注册表值定义要运行的命令,该值的数据是可执行文件或批处理文件的路径。

以下是可执行型工具栏按钮的注册表值说明:
| 名称 | 值类型 | 描述 |
| ---- | ---- | ---- |
| Exec | REG_SZ | 可执行文件或批处理文件的路径 |

以下是一个安装启动可执行文件的工具栏按钮的脚本示例:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\
   {40AD9F9B-3CD9-4F7E-88F2-C70FD438B8F1}]
"CLSID"="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
"ButtonText"="Launch Notepad"
"Icon"="C:\\ProIeDev\\10\\ToolbarButton\\Exec\\Notepad.ico"
"HotIcon"="C:\\ProIeDev\\10\\ToolbarButton\\Exec\\Notepad.ico"
"Default Visible"="yes"
"Exec"="\"C:\\windows\\notepad.exe\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Extensions\
   {B9759B89-2906-47DA-AE9B-F1CA25B8729D}]
"CLSID"="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
"ButtonText"="Launch Notepad"
"Icon"="C:\\ProIeDev\\10\\ToolbarButton\\Exec\\Notepad.ico"
"HotIcon"="C:\\ProIeDev\\10\\ToolbarButton\\Exec\\Notepad.ico"
"Default Visible"="yes"
"Exec"="\"C:\\windows\\notepad.exe\""

此安装脚本为64位和32位IE安装都创建了图标。 Icon HotIcon 值都指向 Notepad.exe 的应用程序图标,按钮文本显示为“Launch Notepad”,并设置为安装后显示。 Exec 值指向Windows目录中的 Notepad.exe 应用程序文件。

当点击按钮时,IE会尝试运行 Exec 值的内容,即启动 Notepad.exe 。在IE 8及以上版本中,如果之前未从浏览器框架启动过该可执行文件,会显示受保护模式提升提示,用户必须通过对话框授权该应用程序在这种情况下使用。

要卸载这个扩展,只需使用一个简单的脚本移除与该对象相关的键,示例脚本如下:

Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\
   {40AD9F9B-3CD9-4F7E-88F2-C70FD438B8F1}]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Extensions\
   {B9759B89-2906-47DA-AE9B-F1CA25B8729D}]
2.4 通过工具栏按钮调用COM对象

工具栏按钮点击时可以调用COM对象,开发者可以将COM应用程序的现有功能集成到这个简单的IE扩展中。

使用COM对象调用的工具栏按钮除了常见的工具栏按钮值外,还定义了 ClsidExtension 注册表值,该值的数据是要调用的COM对象的类ID。

以下是调用COM对象的工具栏按钮的注册表值说明:
| 名称 | 值类型 | 描述 |
| ---- | ---- | ---- |
| ClsidExtension | REG_SZ | 要调用的COM对象的类ID |

当点击使用COM对象调用的工具栏按钮时,IE会实例化该值中指定的对象,并通过 IOleCommandTarget 接口的 Exec 方法发出点击事件信号。

构建调用COM对象的工具栏按钮的第一步是确保有一个可调用的对象可用。可以使用.NET Framework及其COM互操作性功能轻松构建这样的对象。

以下是一个实现 IOleCommandTarget 接口并通过新GUID公开的新COM组件的基本框架:

namespace ProIeDev.ToolbarButtonComObject {

   [ComVisible(true), Guid(Plugin.Guid)]
   public class Plugin : IOleCommandTarget {
      ...
   }
}

Plugin 对象将自己定义为对COM可见,并在类属性中定义其GUID。它在类定义中实现了 IOleCommandTarget 接口,该接口在随附项目的另一个类中定义。

Plugin 类中定义了一些与扩展和COM对象相关的常量,主要是为了方便,代码如下:

#region Constants

/// <summary>
/// Guid of this assembly
/// </summary>
public const string Guid = @"193BD928-F965-47DD-B9FF-83173B9E20F5";

/// <summary>
/// ProgId of this plug-in
/// </summary>
public const string ProgId = "ProIeDev.ToolbarButtonComObject.Button";

/// <summary>
/// Name of the currently executing assembly
/// </summary>
public static string AssemblyName = Assembly.GetExecutingAssembly().GetName().Name;

/// <summary>
/// Guid of the IE plug-in
/// </summary>
public const string PluginGuid = "{9651DC31-B70E-4B80-BF02-BA3FF9A50E2B}";

/// <summary>
/// Registry key where the plug-in will be installed
/// </summary>
public const string PluginKey = @"SOFTWARE\Microsoft\Internet Explorer\Extensions";

/// <summary>
/// WoW emulation registry key for the plug-in
/// </summary>
public const string PluginKeyWow = @"SOFTWARE\Wow6432Node\Microsoft\Internet
Explorer\Extensions";

/// <summary>
/// Hive to install the plug-in into
/// </summary>
public static readonly RegistryKey PluginHive = Registry.LocalMachine;

#endregion Constants

这个COM对象在其注册和注销功能中还会安装一个工具栏按钮。用于此过程的数据存储在一个设置属性中,如下所示:

#region Properties

/// <summary>
///  
/// </summary>
public static Settings PluginSettings {  
   get { return new Settings() {

      //  Text shown alongside the toolbar button
      { "ButtonText", "ToolbarButtonComObject Example" },

      //  Icon shown for the button's "active" state
      { "HotIcon", Utils.AssemblyDirectory + @"\Resources\Icon.ico" },

      //  Default icon for the button
      { "Icon", Utils.AssemblyDirectory + @"\Resources\Icon.ico" },

      //  Whether or not the button is initially visible
      { "Default Visible", "Yes" },

      //  CLSID of the IE toolbar band object
      { "CLSID", "{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}" },

      //  Guid of the COM component to run when the button
      //  is clicked (this library)
      { "ClsidExtension", "{" + Guid + "}" }

   }; }
}

#endregion Properties

这些属性通过COM注册和注销方法分别写入和从系统注册表中移除。.NET程序集注册实用程序在将此COM对象从系统类目录和全局程序集缓存(GAC)中注册或注销后,会调用这些函数。IE只会加载其程序集位于GAC中的.NET COM对象。

以下是 Plugin 类的注册( RegisterServer(...) )和注销( UnregisterServer() )方法:

#region COM Registration Methods
/// <summary>
/// Performs COM and GAC registration services
/// </summary>
/// <param name="type"></param>
[ComRegisterFunction]
public static void RegisterServer(Type type) 
{
   //  Create a new registry tools object
   RegistryTools registry = new RegistryTools() {
      Hive = PluginHive
      };
   //  This is a 32-bit plug-in, so determine if the target
   //  key needs to access a WoW emulation key
   string key =
      String.Format(
         @"{0}\{1}",
         ((Platform.GetPlatform() == PlatformType.X64) ?  
            PluginKeyWow : PluginKey),
         PluginGuid
         );
   //  Loop through each of the plug-in settings and add
   //  them to the registry
   foreach (var setting in PluginSettings) {
      registry.WriteValue(
         key,
         setting.Key,  
         setting.Value,
         RegistryValueKind.String
         );
   }
}
/// <summary>
/// Performs COM and GAC unregistration services
/// </summary>
[ComUnregisterFunction]
public static void UnregisterServer() {
   //  Create a new registry tools object
   RegistryTools registry = new RegistryTools() {
      Hive = PluginHive
      };
   //  Ensure that the 32-bit key is created since a user
   //  may be running a 64-bit .NET Framework as well
   string key =
      String.Format(
         @"{0}\{1}",
         ((Platform.GetPlatform() == PlatformType.X64) ?
            PluginKeyWow : PluginKey),
         PluginGuid
         );

   //  Loop through each of the plug-in settings and
   //  delete them from the registry
   foreach (var setting in PluginSettings)
      registry.DeleteValue(
         key,  
         setting.Key
         );

   //  Delete the plug-in key altogether
   registry.DeleteKey(PluginKey);

}

#endregion COM Registration Methods

在这些方法中,该类 Settings 属性中定义的每个键/值对都会被添加到或从注册表中删除。当这些值被添加或移除时,IE会相应地添加或移除工具栏按钮,这些方法的作用与之前工具栏按钮实现示例中使用的安装和卸载注册表脚本相同。

Plugin 类定义实现了 IOleCommandTarget 接口,因此必须实现该接口定义的所有方法。 IOleCommandTarget 定义了两个方法: QueryStatus Exec 。简单来说, QueryStatus 用于发出对象的命令状态, Exec 用于命令对象执行操作。IE使用 Exec 命令告诉COM对象工具栏按钮已被点击,因此当 Exec 被调用时, Plugin 类会执行相应的操作。

以下是 Plugin 类对 IOleCommandTarget 方法的实现:

#region IOleCommandTarget Interface Methods

/// <summary>
/// Queries the object for the status of one or more  
/// commands generated by UI events.
/// </summary>
/// ...
public int QueryStatus(
   ref Guid pguidCmdGroup,  
   uint cCmds,
   OLECMD[] prgCmds,  
   IntPtr pCmdText) {

   //  Acknowledge query    
   return 0;  // S_OK

}

/// <summary>
/// Executes the specified command or displays help for the command
/// </summary>
/// ...
public int Exec(
   ref Guid pguidCmdGroup,  
   uint nCmdID,  
   uint nCmdexecopt,  
   IntPtr pvaIn,  
   IntPtr pvaOut) {

   //  Call the plug-in click event helper
   OnToolbarButtonClick();

   //  Acknowledge command    
   return 0;  // S_OK

}

#endregion IOleCommandTarget Interface Methods

在这个例子中, Exec 方法用于触发一个事件。当宿主应用程序(IE)调用 Exec 时, Plugin 类会调用 OnToolbarButtonClick() 函数来响应按钮点击事件。在两种情况下,都会返回一个值(-1)来确认函数调用。

Plugin 类定义了 OnToolbarButtonClick() 方法,当工具栏按钮被点击且IE调用 Exec 方法时执行相应操作,其代码如下:

#region Helper Methods

[STAThread]
public void OnToolbarButtonClick() {

   //  Create a new instance of the Display form and
   //  show it as a dialog
   Form display = new Display();
   DialogResult result = display.ShowDialog();

   //  Dispose of the form when finished
   display.Dispose();

}

#endregion Helper Methods

在这个例子中,一个名为 Display 的表单实例作为对话框显示。当表单关闭时,其类实例会被释放。

将这个插件添加到IE的最后一步是注册刚刚创建的COM组件。注册过程还会将工具栏按钮设置写入注册表,将插件添加到IE以及系统COM类目录中。

以下是一个用于从命令行注册和注销新插件的独立实用程序应用程序:

/// <summary>
/// This program registers a .NET-based COM object  
/// </summary>
class Program {

   /// <summary>
   /// Main entry point for this application
   /// </summary>
   /// <param name="args">Command line args</param>
   static void Main(string[] args) {

      //  If no argument was passed or too many were passed,
      //  exit the application
      if (args.Length != 1) return;

      //  Switch on the argument passed into the app
      switch (args[0].Trim().ToLower()) {

         //  Installation argument
         case "-i": {

            //  Attempt to register the assembly
            Assembly assembly = Assembly.LoadFile(
               String.Format(
                  @"{0}\{1}.dll",
                  ProIeDev.ToolbarButtonComObject.Classes.Utils.AssemblyDirectory,
                  ProIeDev.ToolbarButtonComObject.Plugin.AssemblyName
                  )
               );
            RegistrationServices regasm = new RegistrationServices();
            regasm.RegisterAssembly(assembly, AssemblyRegistrationFlags.SetCodeBase);

            //  Exit the application
            return;

         }

         //  Uninstallation argument
         case "-u": {

            //  Attempt to unregister the assembly
            Assembly assembly = Assembly.LoadFile(
               String.Format(
                  @"{0}\{1}.dll",
                  ProIeDev.ToolbarButtonComObject.Classes.Utils.AssemblyDirectory,
                  ProIeDev.ToolbarButtonComObject.Plugin.AssemblyName
                  )
               );
            RegistrationServices regasm = new RegistrationServices();
            regasm.UnregisterAssembly(assembly);

            //  Exit the application
            return;

         }

      }

   }

}

这个实用程序需要一个命令参数,该参数的值可以是 -i (安装插件)或 -u (从系统中移除插件)。

演示这个例子时,首先要运行上述的安装程序,该程序必须以管理员权限运行。安装实用程序会同时注册COM程序集并将工具栏元数据添加到系统注册表中。安装后,点击新的工具栏按钮,IE会调用新的COM对象,该对象会创建一个表单实例并将其作为对话框显示在IE浏览器窗口之上。

综上所述,通过以上方法,开发者可以在IE浏览器中构建和使用各种轻量级的按钮和菜单扩展,为用户提供更加便捷和个性化的操作体验。在实际开发中,要根据具体需求选择合适的扩展方式,并注意权限和兼容性等问题。

构建轻量级按钮和菜单扩展

3. 操作步骤总结

为了更清晰地展示如何构建和使用这些轻量级的按钮和菜单扩展,下面将操作步骤进行总结。

3.1 添加工具栏按钮
  • 定义按钮属性 :通过注册表值定义按钮的基本属性,如 CLSID ButtonText Icon HotIcon Default Visible 等。
  • 选择存储位置 :将注册表值存储在 HKEY_LOCAL_MACHINE HKEY_CURRENT_USER 项中,64位系统的32位扩展放在 Software\Wow6432Node\Microsoft\Internet Explorer\Extensions 下。
  • 示例代码
HKEY_CURRENT_USER\
   Software\
      Microsoft\
         Internet Explorer\
            Extensions\
               {D862829C-9A39-4029-A4CC-2A78C9C1F2F3}\
                  CLSID             (REG_SZ)  = "{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
                  ButtonText        (REG_SZ)  = "My button"
                  Icon              (REG_SZ)  = "C:\\MyIcon.ico"
                  HotIcon           (REG_SZ)  = "C:\\MyHotIcon.ico"
                  Default Visible   (REG_SZ)  = "yes"
                  ...
3.2 使用工具栏按钮运行脚本
  • 设置 Script :通过 Script 注册表值指定脚本文件的路径。
  • 编写脚本内容 :在脚本文件中编写启动网页或执行系统命令的代码。
  • 示例代码
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\
   {E210FAE5-3322-4DF7-94E2-B134CC624B35}]
"CLSID"="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
"ButtonText"="Launch MSDN"
"Icon"="C:\\ProIeDev\\10\\ToolbarButton\\Script\\MSDN.ico"
"HotIcon"="C:\\ProIeDev\\10\\ToolbarButton\\Script\\MSDN.ico"
"Default Visible"="Yes"
"Script"="C:\\ProIeDev\\10\\ToolbarButton\\Script\\Run.html"
<html>
   <body>
      <script type="text/javascript">

         //  Create a new ActiveX shell object
         var shell = new ActiveXObject("WScript.Shell");

         //  Open up a new instance of IE pointing
         //  to a URL
         shell.run("iexplore.exe " +
                   "http://msdn.microsoft.com"
                   );

      </script>
   </body>
</html>
3.3 通过工具栏按钮启动可执行文件
  • 设置 Exec :通过 Exec 注册表值指定可执行文件或批处理文件的路径。
  • 处理权限问题 :在IE 8及以上版本中,启动未授权的可执行文件会显示受保护模式提升提示。
  • 示例代码
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Extensions\
   {40AD9F9B-3CD9-4F7E-88F2-C70FD438B8F1}]
"CLSID"="{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}"
"ButtonText"="Launch Notepad"
"Icon"="C:\\ProIeDev\\10\\ToolbarButton\\Exec\\Notepad.ico"
"HotIcon"="C:\\ProIeDev\\10\\ToolbarButton\\Exec\\Notepad.ico"
"Default Visible"="yes"
"Exec"="\"C:\\windows\\notepad.exe\""
3.4 通过工具栏按钮调用COM对象
  • 创建COM组件 :使用.NET Framework及其COM互操作性功能创建实现 IOleCommandTarget 接口的COM组件。
  • 注册COM组件 :通过注册和注销方法将COM组件的相关信息写入和移除系统注册表。
  • 示例代码
namespace ProIeDev.ToolbarButtonComObject {

   [ComVisible(true), Guid(Plugin.Guid)]
   public class Plugin : IOleCommandTarget {
      ...
   }
}
#region COM Registration Methods
/// <summary>
/// Performs COM and GAC registration services
/// </summary>
/// <param name="type"></param>
[ComRegisterFunction]
public static void RegisterServer(Type type) 
{
   //  Create a new registry tools object
   RegistryTools registry = new RegistryTools() {
      Hive = PluginHive
      };
   //  This is a 32-bit plug-in, so determine if the target
   //  key needs to access a WoW emulation key
   string key =
      String.Format(
         @"{0}\{1}",
         ((Platform.GetPlatform() == PlatformType.X64) ?  
            PluginKeyWow : PluginKey),
         PluginGuid
         );
   //  Loop through each of the plug-in settings and add
   //  them to the registry
   foreach (var setting in PluginSettings) {
      registry.WriteValue(
         key,
         setting.Key,  
         setting.Value,
         RegistryValueKind.String
         );
   }
}
/// <summary>
/// Performs COM and GAC unregistration services
/// </summary>
[ComUnregisterFunction]
public static void UnregisterServer() {
   //  Create a new registry tools object
   RegistryTools registry = new RegistryTools() {
      Hive = PluginHive
      };
   //  Ensure that the 32-bit key is created since a user
   //  may be running a 64-bit .NET Framework as well
   string key =
      String.Format(
         @"{0}\{1}",
         ((Platform.GetPlatform() == PlatformType.X64) ?
            PluginKeyWow : PluginKey),
         PluginGuid
         );

   //  Loop through each of the plug-in settings and
   //  delete them from the registry
   foreach (var setting in PluginSettings)
      registry.DeleteValue(
         key,  
         setting.Key
         );

   //  Delete the plug-in key altogether
   registry.DeleteKey(PluginKey);

}

#endregion COM Registration Methods
4. 流程图展示

下面是一个mermaid格式的流程图,展示了通过工具栏按钮调用COM对象的整体流程:

graph LR
    A[创建COM组件] --> B[注册COM组件]
    B --> C[添加工具栏按钮]
    C --> D[点击工具栏按钮]
    D --> E[IE实例化COM对象]
    E --> F[触发Exec方法]
    F --> G[执行OnToolbarButtonClick方法]
    G --> H[显示对话框]
5. 注意事项
  • 权限问题 :从工具栏按钮实例化的脚本具有增强的权限,普通网页无法实例化 WScript.Shell 对象或其他高权限对象。在IE 8及以上版本中,启动未授权的可执行文件会显示受保护模式提升提示。
  • 兼容性问题 :IE只会加载其程序集位于GAC中的.NET COM对象,因此在开发和部署时要确保COM组件的程序集正确放置。
  • 注册表操作 :对注册表的操作需要谨慎,错误的操作可能会导致系统不稳定。在进行注册表修改时,建议先备份注册表。
6. 总结

通过以上介绍,我们了解了在IE浏览器中构建和使用轻量级按钮和菜单扩展的多种方法,包括上下文菜单扩展、添加工具栏按钮、使用工具栏按钮运行脚本、启动可执行文件以及调用COM对象等。每种方法都有其特点和适用场景,开发者可以根据具体需求选择合适的扩展方式。

在实际开发过程中,要注意权限和兼容性等问题,确保扩展的稳定性和安全性。同时,合理利用这些扩展可以为用户提供更加便捷和个性化的操作体验,提升网页应用的用户满意度。希望本文对开发者在构建浏览器扩展方面有所帮助。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值