zoukankan      html  css  js  c++  java
  • IE浏览器右键菜单插件开发(下篇)——如何用c#安装、卸载IE右键插件

    建立Installer安装类,如图:

    代码如下:

      1 using Microsoft.Win32;
      2 using ResourceShare.UserClient.Common;
      3 using System;
      4 using System.Collections;
      5 using System.Collections.Generic;
      6 using System.ComponentModel;
      7 using System.Configuration.Install;
      8 using System.Diagnostics;
      9 using System.IO;
     10 using System.Linq;
     11 using System.Text;
     12 
     13 namespace HtmlExtractor
     14 {
     15     [RunInstaller(true)]
     16     public partial class InstallerIEPlugin : System.Configuration.Install.Installer
     17     {
     18 
     19         private static string STRING_INTERNET_EXPLORER_MENU_EXT_NAME = "右键菜单名称(可修改)";
     20 
     21         private static string ClassId = "DCA4FF81-B81E-4ADF-B6A8-886DEEFE3250";
     22 
     23         public InstallerIEPlugin()
     24         {
     25             InitializeComponent();
     26         }
     27 
     28         public static bool Install(string dllFullName)
     29         {
     30             bool result = false;
     31             ProcessStartInfo processStartInfo = new ProcessStartInfo();
     32             StringBuilder builder = new StringBuilder();
     33             Win32APIsFull.GetWindowsDirectory(builder, 255);
     34 
     35             processStartInfo.FileName = Path.Combine(builder.ToString(), "Microsoft.NET" + Path.DirectorySeparatorChar + "Framework" + Path.DirectorySeparatorChar + string.Format("v{0}", Environment.Version.ToString(3)) + Path.DirectorySeparatorChar + "RegAsm.exe");
     36             processStartInfo.Arguments = string.Format(""{0}" /codebase", dllFullName);
     37             processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
     38             Process.Start(processStartInfo).WaitForExit();
     39 
     40             try
     41             {
     42                 //为mscrollpath重新建立路径
     43                 using (RegistryKey clessids = Registry.ClassesRoot.OpenSubKey("CLSID\{" + ClassId + "}\InprocServer32", RegistryKeyPermissionCheck.ReadWriteSubTree))
     44                 {
     45                     if (clessids != null)
     46                     {
     47                         clessids.SetValue("", Path.Combine(Environment.SystemDirectory, "mscoree.dll"));
     48                     }
     49                 }
     50                 //删除所有ShareyIE右键
     51                 using (RegistryKey menuExtKey = Registry.CurrentUser.CreateSubKey(@"SoftwareMicrosoftInternet ExplorerMenuExt", RegistryKeyPermissionCheck.ReadWriteSubTree))
     52                 {
     53                     foreach (string subName in menuExtKey.GetSubKeyNames())
     54                     {
     55                         if (subName.Contains("Sharey"))
     56                         {
     57                             menuExtKey.DeleteSubKey(subName);
     58                         }
     59                     }
     60                 }
     61                 result = true;
     62             }
     63             catch (Exception ex)
     64             {
     65                 result = false;
     66                 Logger.Debug(ex.Message + "
    " + ex.StackTrace);
     67             }
     68 
     69             try
     70             {
     71                 using (RegistryKey internetExplorerMenuExt = Registry.CurrentUser.CreateSubKey(@"SoftwareMicrosoftInternet ExplorerMenuExt" + STRING_INTERNET_EXPLORER_MENU_EXT_NAME, RegistryKeyPermissionCheck.ReadWriteSubTree))
     72                 {
     73                     internetExplorerMenuExt.SetValue("", Path.Combine(Path.GetDirectoryName(dllFullName), @"IEExtractor.htm"));
     74                     internetExplorerMenuExt.SetValue("Contexts", 243, RegistryValueKind.DWord);
     75                 }
     76                 result = true;
     77             }
     78             catch (Exception ex)
     79             {
     80                 result = false;
     81                 Logger.Debug(ex.Message + "
    " + ex.StackTrace);
     82             }
     83             return result;
     84         }
     85 
     86         public static bool UnInstall(string dllFullName)
     87         {
     88             bool result = false;
     89             try
     90             {
     91                 Registry.CurrentUser.DeleteSubKey(@"SoftwareMicrosoftInternet ExplorerMenuExt" + STRING_INTERNET_EXPLORER_MENU_EXT_NAME, false);
     92 
     93                 using (RegistryKey menuExtKey = Registry.CurrentUser.CreateSubKey(@"SoftwareMicrosoftInternet ExplorerMenuExt", RegistryKeyPermissionCheck.ReadWriteSubTree))
     94                 {
     95                     foreach (string subName in menuExtKey.GetSubKeyNames())
     96                     {
     97                         if (subName.Contains("Sharey"))
     98                         {
     99                             menuExtKey.DeleteSubKey(subName);
    100                         }
    101                     }
    102                 }
    103                 result = true;
    104             }
    105             catch (Exception ex)
    106             {
    107                 result = false;
    108                 Logger.Debug(ex.Message + "
    " + ex.StackTrace);
    109             }
    110 
    111             try
    112             {
    113                 ProcessStartInfo processStartInfo = new ProcessStartInfo();
    114 
    115                 StringBuilder builder = new StringBuilder();
    116                 Win32APIsFull.GetWindowsDirectory(builder, 255);
    117 
    118                 processStartInfo.FileName = Path.Combine(builder.ToString(), "Microsoft.NET" + Path.DirectorySeparatorChar + "Framework" + Path.DirectorySeparatorChar + string.Format("v{0}", Environment.Version.ToString(3)) + Path.DirectorySeparatorChar + "RegAsm.exe");
    119 
    120                 processStartInfo.Arguments = string.Format(" "{0}" /unregister", dllFullName);
    121                 processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    122 
    123                 Process.Start(processStartInfo).WaitForExit();
    124                 result = true;
    125             }
    126             catch (Exception ex)
    127             {
    128                 result = false;
    129                 Logger.Debug(ex.Message + "
    " + ex.StackTrace);
    130             }
    131             return result;
    132         }
    133 
    134         public override void Install(IDictionary stateSaver)
    135         {
    136             base.Install(stateSaver);
    137         }
    138 
    139         public override void Commit(IDictionary savedState)
    140         {
    141             Install(this.Context.Parameters["assemblypath"]);
    142 
    143             base.Commit(savedState);
    144         }
    145 
    146         public override void Rollback(IDictionary savedState)
    147         {
    148             UnInstall(this.Context.Parameters["assemblypath"]);
    149 
    150             base.Rollback(savedState);
    151         }
    152 
    153         public override void Uninstall(IDictionary savedState)
    154         {
    155             UnInstall(this.Context.Parameters["assemblypath"]);
    156 
    157             base.Uninstall(savedState);
    158         }
    159 
    160         public static bool IsSetuped()
    161         {
    162             return (Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Internet Explorer\MenuExt\" + STRING_INTERNET_EXPLORER_MENU_EXT_NAME, RegistryKeyPermissionCheck.ReadSubTree) != null);
    163         }
    164     }
    165 }

    第33行,调用了win32:的方法:

            /// <summary>
            /// 获取系统安装目录
            /// </summary>
            /// <param name="SysDir"></param>
            /// <param name="count"></param>
            [DllImport("kernel32.dll")]
            public static extern void GetWindowsDirectory(StringBuilder WinDir, int count);
  • 相关阅读:
    libevent源码学习之event
    游戏寻路A*算法
    游戏地图动态生成
    一个基于protocol buffer的RPC实现
    TCMalloc源码学习(四)(小内存块释放)
    TCMalloc源码学习(三)(小块内存分配)
    TCMalloc源码学习(二)
    第五十四篇 Linux相关——远程连接SSH
    第五十三篇 Linux相关——Web服务器
    第五十二篇 Linux相关——数据库服务MySQL
  • 原文地址:https://www.cnblogs.com/wangqiang3311/p/8027938.html
Copyright © 2011-2022 走看看