建立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, );
  34.  
  35. processStartInfo.FileName = Path.Combine(builder.ToString(), "Microsoft.NET" + Path.DirectorySeparatorChar + "Framework" + Path.DirectorySeparatorChar + string.Format("v{0}", Environment.Version.ToString()) + 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(@"Software\Microsoft\Internet Explorer\MenuExt", 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 + "\r\n" + ex.StackTrace);
  67. }
  68.  
  69. try
  70. {
  71. using (RegistryKey internetExplorerMenuExt = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Internet Explorer\MenuExt\" + STRING_INTERNET_EXPLORER_MENU_EXT_NAME, RegistryKeyPermissionCheck.ReadWriteSubTree))
  72. {
  73. internetExplorerMenuExt.SetValue("", Path.Combine(Path.GetDirectoryName(dllFullName), @"IEExtractor.htm"));
  74. internetExplorerMenuExt.SetValue("Contexts", , RegistryValueKind.DWord);
  75. }
  76. result = true;
  77. }
  78. catch (Exception ex)
  79. {
  80. result = false;
  81. Logger.Debug(ex.Message + "\r\n" + 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(@"Software\Microsoft\Internet Explorer\MenuExt\" + STRING_INTERNET_EXPLORER_MENU_EXT_NAME, false);
  92.  
  93. using (RegistryKey menuExtKey = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Internet Explorer\MenuExt", 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 + "\r\n" + ex.StackTrace);
  109. }
  110.  
  111. try
  112. {
  113. ProcessStartInfo processStartInfo = new ProcessStartInfo();
  114.  
  115. StringBuilder builder = new StringBuilder();
  116. Win32APIsFull.GetWindowsDirectory(builder, );
  117.  
  118. processStartInfo.FileName = Path.Combine(builder.ToString(), "Microsoft.NET" + Path.DirectorySeparatorChar + "Framework" + Path.DirectorySeparatorChar + string.Format("v{0}", Environment.Version.ToString()) + 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 + "\r\n" + 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:的方法:

  1. /// <summary>
  2. /// 获取系统安装目录
  3. /// </summary>
  4. /// <param name="SysDir"></param>
  5. /// <param name="count"></param>
  6. [DllImport("kernel32.dll")]
  7. public static extern void GetWindowsDirectory(StringBuilder WinDir, int count);

IE浏览器右键菜单插件开发(下篇)——如何用c#安装、卸载IE右键插件的更多相关文章

  1. IE浏览器右键菜单插件开发(上篇)——自定义一个IE右键菜单项

    要做一个IE右键浏览器插件,得3步走. 第一,在IE右键菜单上添加自定义菜单名称,是通过注册表实现的,如下: string regkey = @"Software\Microsoft\Int ...

  2. 自定义右键菜单,禁用浏览器自带的右键菜单[右键菜单实现--Demo]

    许多从事Web开发的会发现有些事,我们需要禁用浏览器本事自带的右键菜单,而实现自定义的右键菜单下面我们也来实现一个自定义的右键菜单 首先来创建JSP页面 <%@ page language=&q ...

  3. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(六) 之 Layim源码改造右键菜单--好友、组管理功能的实现。

    前言 上一篇中讲解了加好友的流程,本篇将介绍好友管理,群组管理的右键菜单功能.当然由于菜单项目太多,都实现也得花费时间.只讲解一下我是如何从不知道怎么实现右键菜单到会自定义菜单的一个过程.另外呢,针对 ...

  4. 几款jQuery右键菜单插件介绍

    在网页中使用自定义右键菜单,实现上皆为使用javascript禁用浏览器默认的右键菜单,然后在网页中响应鼠标右键事件,弹出自定义的菜单. 类似右键菜单的组件网上很多.一般而言,改变浏览器的默认菜单应当 ...

  5. 怎样在Windows资源管理器中添加右键菜单以及修改右键菜单顺序

    有时,我们需要在Windows资源管理器的右键菜单中添加一些项,以方便使用某些功能或程序. 比如我的电脑上有一个免安装版的Notepad++,我想在所有文件的右键菜单中添加一项用Notepad++打开 ...

  6. jQuery右键菜单contextMenu使用实例

    在最近项目中需要频繁的右键菜单操作.我采用了contextMenu这款jQuery插件. 参考网址:http://www.jb51.net/article/58709.htm 官网demo http: ...

  7. Qt之QAbstractItemView右键菜单

    一.功能概述 说起右键菜单,之前Qt之自定义QLineEdit右键菜单这篇文章中我已经讲述过3种右键菜单的实现方式,今儿也是在啰嗦一下,针对QListWidget类在定制一下右键菜单,我使用的具体方式 ...

  8. Jquery 右键菜单(ContextMenu)插件使用记录

    目前做的项目需要在页面里面用右键菜单,在网上找到两种jquery的右键菜单插件,但是都有各种问题.所以就自己动手把两种插件结合了下. 修改后的右键菜单插架可以根据绑定的触发页面元素不同,复用同一个菜单 ...

  9. [Visual Studio] 开启Visual Studio 2012通过右键菜单创建单元测试(Unit Test)

    Visual Studio 2012可以说是迄今为止微软VS开发工具中用户体验最好的产品,无论是速度还是体验以及功能,都非常出色,但是,使用了一段时间后发现有一个之前版本VS都有的功能却在Visual ...

随机推荐

  1. Python逻辑运算符

    逻辑运算符主要用来做逻辑判断,逻辑运算符和比较运算符放一起的,同样用于条件选择和循环. 以下假设变量 a 为 10, b为 20: 示例1: #and是并且,所有的条件都是True,结果才是True: ...

  2. 2015年百度实习生前端笔试题上海卷a

    1.写出javascript运行结果:alert(‘5’+5); 结果:’55’ 2.写出javascript运行结果:for(var i=0; i<10; i++){} alert(i); 结 ...

  3. C++11 左值、右值、右值引用详解

    C++11 左值.右值.右值引用详解 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值. 在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没 ...

  4. bzoj2151 种树 双向链表+堆

    2151: 种树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1151  Solved: 613[Submit][Status][Discuss] ...

  5. 初学Python(第二课)

    一.列表.元组的操作 1.定义:列表类似于C中的数组,使用方法也相似.它的定义举例如下:letter = ['A','B','C','D','E','F']; 2.列表的切片 (1)访问一个元素且知道 ...

  6. PHP网站的安全要点

    1. 删除不必要的模块 PHP随带内置的PHP模块.它们对许多任务来说很有用,但是不是每个项目都需要它们.只要输入下面这个命令,就可以查看可用的PHP模块: # php - m 一旦你查看了列表,现在 ...

  7. HDU - 2612 bfs [kuangbin带你飞]专题一

    分别以两个人的家作为起点,bfs求得到每个KFC最短距离.然后枚举每个KFC,求得时间之和的最小值即可. 此题不符合实际情况之处:  通过了一个KFC再去另一个KFC可以吗? 出题人都没好好想过吗? ...

  8. 个人觉得实用的Python姿势

    以后会陆续补充 偶然在Python Cookbook看到一个format操作,想到一个问题, 感觉用了!r之后,会把传入的对象按照原来形式保留 d = {"foo": " ...

  9. H3C三层交换机配置IP

    1.直接在物理端口上设置IP地址. int f1/0/1 port link-mode route #链路模式采用路由 ip add 192.168.10.1 24 ospf network0type ...

  10. Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用

    K8s基础原理 k8s中文社区:https://www.kubernetes.org.cn/ 简介 Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更 ...