建立Installer安装类,如图:

代码如下:

 using Microsoft.Win32;
using ResourceShare.UserClient.Common;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text; namespace HtmlExtractor
{
[RunInstaller(true)]
public partial class InstallerIEPlugin : System.Configuration.Install.Installer
{ private static string STRING_INTERNET_EXPLORER_MENU_EXT_NAME = "右键菜单名称(可修改)"; private static string ClassId = "DCA4FF81-B81E-4ADF-B6A8-886DEEFE3250"; public InstallerIEPlugin()
{
InitializeComponent();
} public static bool Install(string dllFullName)
{
bool result = false;
ProcessStartInfo processStartInfo = new ProcessStartInfo();
StringBuilder builder = new StringBuilder();
Win32APIsFull.GetWindowsDirectory(builder, ); processStartInfo.FileName = Path.Combine(builder.ToString(), "Microsoft.NET" + Path.DirectorySeparatorChar + "Framework" + Path.DirectorySeparatorChar + string.Format("v{0}", Environment.Version.ToString()) + Path.DirectorySeparatorChar + "RegAsm.exe");
processStartInfo.Arguments = string.Format("\"{0}\" /codebase", dllFullName);
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(processStartInfo).WaitForExit(); try
{
//为mscrollpath重新建立路径
using (RegistryKey clessids = Registry.ClassesRoot.OpenSubKey("CLSID\\{" + ClassId + "}\\InprocServer32", RegistryKeyPermissionCheck.ReadWriteSubTree))
{
if (clessids != null)
{
clessids.SetValue("", Path.Combine(Environment.SystemDirectory, "mscoree.dll"));
}
}
//删除所有ShareyIE右键
using (RegistryKey menuExtKey = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Internet Explorer\MenuExt", RegistryKeyPermissionCheck.ReadWriteSubTree))
{
foreach (string subName in menuExtKey.GetSubKeyNames())
{
if (subName.Contains("Sharey"))
{
menuExtKey.DeleteSubKey(subName);
}
}
}
result = true;
}
catch (Exception ex)
{
result = false;
Logger.Debug(ex.Message + "\r\n" + ex.StackTrace);
} try
{
using (RegistryKey internetExplorerMenuExt = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Internet Explorer\MenuExt\" + STRING_INTERNET_EXPLORER_MENU_EXT_NAME, RegistryKeyPermissionCheck.ReadWriteSubTree))
{
internetExplorerMenuExt.SetValue("", Path.Combine(Path.GetDirectoryName(dllFullName), @"IEExtractor.htm"));
internetExplorerMenuExt.SetValue("Contexts", , RegistryValueKind.DWord);
}
result = true;
}
catch (Exception ex)
{
result = false;
Logger.Debug(ex.Message + "\r\n" + ex.StackTrace);
}
return result;
} public static bool UnInstall(string dllFullName)
{
bool result = false;
try
{
Registry.CurrentUser.DeleteSubKey(@"Software\Microsoft\Internet Explorer\MenuExt\" + STRING_INTERNET_EXPLORER_MENU_EXT_NAME, false); using (RegistryKey menuExtKey = Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Internet Explorer\MenuExt", RegistryKeyPermissionCheck.ReadWriteSubTree))
{
foreach (string subName in menuExtKey.GetSubKeyNames())
{
if (subName.Contains("Sharey"))
{
menuExtKey.DeleteSubKey(subName);
}
}
}
result = true;
}
catch (Exception ex)
{
result = false;
Logger.Debug(ex.Message + "\r\n" + ex.StackTrace);
} try
{
ProcessStartInfo processStartInfo = new ProcessStartInfo(); StringBuilder builder = new StringBuilder();
Win32APIsFull.GetWindowsDirectory(builder, ); processStartInfo.FileName = Path.Combine(builder.ToString(), "Microsoft.NET" + Path.DirectorySeparatorChar + "Framework" + Path.DirectorySeparatorChar + string.Format("v{0}", Environment.Version.ToString()) + Path.DirectorySeparatorChar + "RegAsm.exe"); processStartInfo.Arguments = string.Format(" \"{0}\" /unregister", dllFullName);
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(processStartInfo).WaitForExit();
result = true;
}
catch (Exception ex)
{
result = false;
Logger.Debug(ex.Message + "\r\n" + ex.StackTrace);
}
return result;
} public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
} public override void Commit(IDictionary savedState)
{
Install(this.Context.Parameters["assemblypath"]); base.Commit(savedState);
} public override void Rollback(IDictionary savedState)
{
UnInstall(this.Context.Parameters["assemblypath"]); base.Rollback(savedState);
} public override void Uninstall(IDictionary savedState)
{
UnInstall(this.Context.Parameters["assemblypath"]); base.Uninstall(savedState);
} public static bool IsSetuped()
{
return (Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Internet Explorer\\MenuExt\\" + STRING_INTERNET_EXPLORER_MENU_EXT_NAME, RegistryKeyPermissionCheck.ReadSubTree) != null);
}
}
}

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

        /// <summary>
/// 获取系统安装目录
/// </summary>
/// <param name="SysDir"></param>
/// <param name="count"></param>
[DllImport("kernel32.dll")]
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. 在C#中几种常见数组复制方法的效率对比

    原文是在http://blog.csdn.net/jiangzhanchang/article/details/9998229 看到的,本文在原文基础上增加了新的方法,并对多种数据类型做了更全面的对比 ...

  2. 浏览器输入URL到响应页面的全过程

    B/S网络架构从前端到后端都得到了简化,都基于统一的应用层协议HTTP来交互数据,HTTP协议采用无状态的短链接的通信方式,通常情况下,一次请求就完成了一次数据交互,通常也对应一个业务逻辑,然后这次通 ...

  3. spring-boo hello world程序

    作为一个程序猿,使用了spring好多年,现在有了spring-boot,也想尝尝鲜. 初听spring-boot,觉得很神秘,实际上就是集合了很多组件,再加上一些boot开发的启动和粘合程序. 个人 ...

  4. javascript 面向对象(多种创建对象的方式)

    创建对象 第一种:基于Object对象 var person = new Object(); person.name = 'My Name'; person.age = 18; person.getN ...

  5. 有状态InheritableThreadLocal 配合 JDK8 ,异步方法调用

    我们可以把一个类的作用域注解为 @Scope(scopeName = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode. ...

  6. 使用phpstorm提交svn代码版本管理系统遇到的问题解决办法

    1.当自己提交代码的时候显示out of date的时候,表示我们本地的代码过时啦,需要更新一下再提交. 即:更新一下再提交即可. 2.当自己的代码和服务器上的冲突的时候,我们右键点击冲突的文件,选择 ...

  7. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  8. 判断ios或者android

    <script type="text/javascript"> $(function () { // android和iso下载链接 var u = navigator ...

  9. 用GA算法设计22个地点之间最短旅程-R语言实现

    数据挖掘入门与实战  公众号: datadw 相关帖子 转载︱案例 基于贪心算法的特征选择 用GA算法设计22个地点之间最短旅程-R语言实现 ----------------------------- ...

  10. JavaScript实现弹窗报错

    JavaScript实现弹窗报错 1.具体错误如下 SCRIPT 5022:cannot call methods on dialog prior to initialization; attempt ...