简体   繁体   English

开发Internet Explorer,浏览器助手对象扩展?

[英]Developing Internet Explorer, browser helper object extensions?

在此输入图像描述

1) I am trying to make a simple BHO in C# like here already answered: https://stackoverflow.com/a/5740004/285594 1)我试图用C#做一个简单的BHO,就像这里已经回答的那样: https//stackoverflow.com/a/5740004/285594

2) But unfortunately they all tried less then IE11, where some made it work and some failed too 2)但不幸的是,他们都尝试了IE11,其中一些使它工作,一些也失败了

3) after following everything as mentioned in that answer, i also purchased official code sign but it simply does not working in IE11 Windows 7 64-bit. 3)在按照该答案中提到的所有内容之后,我还购买了官方代码符号,但它根本不适用于IE11 Windows 7 64位。

You can download my prepared version of Visual studio 2013: which includes all the source code and details for IE11: 您可以下载我准备好的Visual Studio 2013版本:其中包含IE11的所有源代码和详细信息:

https://www.dropbox.com/s/60kg212vkjb7yud/ClassLibrary2.rar https://www.dropbox.com/s/60kg212vkjb7yud/ClassLibrary2.rar

Q. Can anyone please advise/suggest/help how can i make one hello world of this BHO? 问:任何人都可以建议/建议/帮助我如何打造这个BHO的世界?

I have also tried others sample from codeproject, but still none of them i was able to make work yet, trying since 4 weeks, i am lost, please advise what is wrong in my ClassLibrary2.rar which is not hilighting the text "browser"? 我也尝试了其他代码来自codeproject,但仍然没有一个我能够工作,尝试了4周后,我迷路了,请告诉我的ClassLibrary2.rar有什么问题,这不是浏览文本“浏览器” ?

I am completely lost, please advise. 我完全迷了,请指教。

EDIT: 编辑:

IEAddon.cs IEAddon.cs

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Microsoft.Win32;
using mshtml;
using SHDocVw;

namespace InternetExplorerExtension
{
  [ComVisible(true)]
  [ClassInterface(ClassInterfaceType.None)]
  [Guid("D40C654D-7C51-4EB3-95B2-1E23905C2A2D")]
  [ProgId("MyBHO.WordHighlighter")]
  public class WordHighlighterBHO : IObjectWithSite, IOleCommandTarget
  {
    const string DefaultTextToHighlight = "browser";

    IWebBrowser2 browser;
    private object site;

    #region Highlight Text
    void OnDocumentComplete(object pDisp, ref object URL)
    {
      try
      {

        // This will prevent this method being executed more than once.
        if (pDisp != this.site)
          return;

        var document2 = browser.Document as IHTMLDocument2;
        var document3 = browser.Document as IHTMLDocument3;

        var window = document2.parentWindow;
        window.execScript(@"function FncAddedByAddon() { alert('Message added by addon.'); }");

        Queue<IHTMLDOMNode> queue = new Queue<IHTMLDOMNode>();
        foreach (IHTMLDOMNode eachChild in document3.childNodes)
          queue.Enqueue(eachChild);

        while (queue.Count > 0)
        {
          // replacing desired text with a highlighted version of it
          var domNode = queue.Dequeue();

          var textNode = domNode as IHTMLDOMTextNode;
          if (textNode != null)
          {
            if (textNode.data.Contains(TextToHighlight))
            {
              var newText = textNode.data.Replace(TextToHighlight, "<span style='background-color: yellow; cursor: hand;' onclick='javascript:FncAddedByAddon()' title='Click to open script based alert window.'>" + TextToHighlight + "</span>");
              var newNode = document2.createElement("span");
              newNode.innerHTML = newText;
              domNode.replaceNode((IHTMLDOMNode)newNode);
            }
          }
          else
          {
            // adding children to collection
            var x = (IHTMLDOMChildrenCollection)(domNode.childNodes);
            foreach (IHTMLDOMNode eachChild in x)
            {
              if (eachChild is mshtml.IHTMLScriptElement)
                continue;
              if (eachChild is mshtml.IHTMLStyleElement)
                continue;

              queue.Enqueue(eachChild);
            }
          }
        }
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.Message);
      }
    }
    #endregion
    #region Load and Save Data
    static string TextToHighlight = DefaultTextToHighlight;
    public static string RegData = "Software\\MyIEExtension";

    [DllImport("ieframe.dll")]
    public static extern int IEGetWriteableHKCU(ref IntPtr phKey);

    private static void SaveOptions()
    {
      // In IE 7,8,9,(desktop)10 tabs run in Protected Mode
      // which prohibits writes to HKLM, HKCU.
      // Must ask IE for "Writable" registry section pointer
      // which will be something like HKU/S-1-7***/Software/AppDataLow/
      // In "metro" IE 10 mode, tabs run in "Enhanced Protected Mode"
      // where BHOs are not allowed to run, except in edge cases.
      // see http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx
      IntPtr phKey = new IntPtr();
      var answer = IEGetWriteableHKCU(ref phKey);
      RegistryKey writeable_registry = RegistryKey.FromHandle(
          new Microsoft.Win32.SafeHandles.SafeRegistryHandle(phKey, true)
      );
      RegistryKey registryKey = writeable_registry.OpenSubKey(RegData, true);

      if (registryKey == null)
        registryKey = writeable_registry.CreateSubKey(RegData);
      registryKey.SetValue("Data", TextToHighlight);

      writeable_registry.Close();
    }
    private static void LoadOptions()
    {
      // In IE 7,8,9,(desktop)10 tabs run in Protected Mode
      // which prohibits writes to HKLM, HKCU.
      // Must ask IE for "Writable" registry section pointer
      // which will be something like HKU/S-1-7***/Software/AppDataLow/
      // In "metro" IE 10 mode, tabs run in "Enhanced Protected Mode"
      // where BHOs are not allowed to run, except in edge cases.
      // see http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx
      IntPtr phKey = new IntPtr();
      var answer = IEGetWriteableHKCU(ref phKey);
      RegistryKey writeable_registry = RegistryKey.FromHandle(
          new Microsoft.Win32.SafeHandles.SafeRegistryHandle(phKey, true)
      );
      RegistryKey registryKey = writeable_registry.OpenSubKey(RegData, true);

      if (registryKey == null)
        registryKey = writeable_registry.CreateSubKey(RegData);
      registryKey.SetValue("Data", TextToHighlight);

      if (registryKey == null)
      {
        TextToHighlight = DefaultTextToHighlight;
      }
      else
      {
        TextToHighlight = (string)registryKey.GetValue("Data");
      }
      writeable_registry.Close();
    }
    #endregion

    [Guid("6D5140C1-7436-11CE-8034-00AA006009FA")]
    [InterfaceType(1)]
    public interface IServiceProvider
    {
      int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject);
    }

    #region Implementation of IObjectWithSite
    int IObjectWithSite.SetSite(object site)
    {
      this.site = site;

      if (site != null)
      {
        LoadOptions();

        var serviceProv = (IServiceProvider)this.site;
        var guidIWebBrowserApp = Marshal.GenerateGuidForType(typeof(IWebBrowserApp)); // new Guid("0002DF05-0000-0000-C000-000000000046");
        var guidIWebBrowser2 = Marshal.GenerateGuidForType(typeof(IWebBrowser2)); // new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E");
        IntPtr intPtr;
        serviceProv.QueryService(ref guidIWebBrowserApp, ref guidIWebBrowser2, out intPtr);

        browser = (IWebBrowser2)Marshal.GetObjectForIUnknown(intPtr);

        ((DWebBrowserEvents2_Event)browser).DocumentComplete +=
            new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
      }
      else
      {
        ((DWebBrowserEvents2_Event)browser).DocumentComplete -=
            new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
        browser = null;
      }
      return 0;
    }
    int IObjectWithSite.GetSite(ref Guid guid, out IntPtr ppvSite)
    {
      IntPtr punk = Marshal.GetIUnknownForObject(browser);
      int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
      Marshal.Release(punk);
      return hr;
    }
    #endregion
    #region Implementation of IOleCommandTarget
    int IOleCommandTarget.QueryStatus(IntPtr pguidCmdGroup, uint cCmds, ref OLECMD prgCmds, IntPtr pCmdText)
    {
      return 0;
    }
    int IOleCommandTarget.Exec(IntPtr pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
    {
      try
      {
        // Accessing the document from the command-bar.
        var document = browser.Document as IHTMLDocument2;
        var window = document.parentWindow;
        var result = window.execScript(@"alert('You will now be allowed to configure the text to highlight...');");

        var form = new HighlighterOptionsForm();
        form.InputText = TextToHighlight;
        if (form.ShowDialog() != DialogResult.Cancel)
        {
          TextToHighlight = form.InputText;
          SaveOptions();
        }
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.Message);
      }

      return 0;
    }
    #endregion

    #region Registering with regasm
    public static string RegBHO = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects";
    public static string RegCmd = "Software\\Microsoft\\Internet Explorer\\Extensions";

    [ComRegisterFunction]
    public static void RegisterBHO(Type type)
    {
      string guid = type.GUID.ToString("B");

      // BHO
      {
        RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegBHO, true);
        if (registryKey == null)
          registryKey = Registry.LocalMachine.CreateSubKey(RegBHO);
        RegistryKey key = registryKey.OpenSubKey(guid);
        if (key == null)
          key = registryKey.CreateSubKey(guid);
        key.SetValue("Alright", 1);
        registryKey.Close();
        key.Close();
      }

      // Command
      {
        RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegCmd, true);
        if (registryKey == null)
          registryKey = Registry.LocalMachine.CreateSubKey(RegCmd);
        RegistryKey key = registryKey.OpenSubKey(guid);
        if (key == null)
          key = registryKey.CreateSubKey(guid);
        key.SetValue("ButtonText", "Highlighter options");
        key.SetValue("CLSID", "{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}");
        key.SetValue("ClsidExtension", guid);
        key.SetValue("Icon", "");
        key.SetValue("HotIcon", "");
        key.SetValue("Default Visible", "Yes");
        key.SetValue("MenuText", "&Highlighter options");
        key.SetValue("ToolTip", "Highlighter options");
        //key.SetValue("KeyPath", "no");
        registryKey.Close();
        key.Close();
      }
    }

    [ComUnregisterFunction]
    public static void UnregisterBHO(Type type)
    {
      string guid = type.GUID.ToString("B");
      // BHO
      {
        RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegBHO, true);
        if (registryKey != null)
          registryKey.DeleteSubKey(guid, false);
      }
      // Command
      {
        RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(RegCmd, true);
        if (registryKey != null)
          registryKey.DeleteSubKey(guid, false);
      }
    }
    #endregion
  }
}

i'm trying to do the same - and i've just noticed that in build log there was an error 我正在尝试做同样的事情 - 我刚刚注意到在构建日志中出现了错误

Failure adding assembly to the cache: Attempt to install an assembly without a strong name 将程序集添加到缓存失败:尝试安装没有强名称的程序集

so i've added *.snk and highlighting worked (using ie11 to, x64), but 'highlight options' menu item isn't working 所以我添加* .snk和突出显示工作(使用ie11到,x64),但'突出显示选项'菜单项不起作用

IEExtension example IEExtension示例

although your IE11 runs in a 64bit Windows, but the default IE instance is 32bit version. 虽然你的IE11运行在64位Windows中,但默认的IE实例是32位版本。 The enhanced protection mode need to be enabled so that IE11 will run in 64bit mode. 需要启用增强保护模式,以便IE11以64位模式运行。

Another trick is for 32bit IE, you have to register 32bit extension, and vice versa for 64bit. 另一个技巧是32位IE,你必须注册32位扩展,反之亦然64位。 My suggestion is as follows: 我的建议如下:

  • make sure your IE11 mode is 32bit or 64bit 确保您的IE11模式为32位或64位
  • register only 32bit or 64bit extension, if both registered, the extension can NOT work either. 只注册32位或64位扩展名,如果两者都注册,则扩展名也无法正常工作。 You have to double check your registry to delete the one un-necessary 您必须仔细检查您的注册表以删除不必要的注册表

I warmly suggest you this post of Pavel Zolnikov published in 2002! 我热烈建议你在2002年出版的Pavel Zolnikov这篇文章!

http://www.codeproject.com/Articles/2219/Extending-Explorer-with-Band-Objects-using-NET-and http://www.codeproject.com/Articles/2219/Extending-Explorer-with-Band-Objects-using-NET-and

It is based on the use of Band objects and is compiled using .Net 2.0. 它基于Band对象的使用,并使用.Net 2.0进行编译。 As you will read on the post comments, it works perfectly well for IE 11 and on Windows 7 and Windows 10. Tutorial source code is provided and opens and compiles well with Visual Studio 2013. Enjoy! 正如您将阅读帖子评论,它适用于IE 11以及Windows 7和Windows 10.教程源代码提供并打开并与Visual Studio 2013编译良好。享受!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM