web-dev-qa-db-ja.com

Internet Explorer拡張機能の開発を開始する方法は?

ここにいる人は、知識を共有できるIE拡張機能を開発した経験がありますか?これには、コードサンプル、適切なサンプルへのリンク、プロセスに関するドキュメントなどが含まれます。

私はこれを本当にやりたいのですが、お粗末なドキュメンテーション、そのお粗末なコード/例のコード/欠如で巨大な壁にぶつかっています。あなたが提供できるヘルプ/リソースは大歓迎です。

具体的には、IE拡張機能内からDOMにアクセス/操作する方法から始めたいと思います。

編集、さらに詳細:

理想的には、クリックすると外部サイトへのリンクを含むメニューをポップアップ表示するツールバーボタンを配置したいと思います。また、いくつかの条件に応じて、DOMにアクセスし、ページにJavaScriptを配置したいと思います。

IE拡張機能で情報を保持する最良の方法は何ですか? Firefox/Chrome /最新のブラウザでは、window.localStorageを使用しますが、IE8/IE7では明らかにこれはオプションではありません。おそらくSQLite DBなどですか? .NET 4.0がユーザーのコンピューターにインストールされると仮定しても大丈夫ですか?

IE9と互換性のあるものを作成したいので、Spice IEを使用したくありません。この質問にもC++タグを追加しました。C++で作成したほうがよい場合は、それができるからです。

204
Alex

[更新]この答えを更新して、Internet Explorer 11Windows 10 x64withVisual Studio 2017 Communityこの回答の以前のバージョン(Windows 7 x64およびVisual Studio 2010のInternet Explorer 8用)は、この回答の下部にあります。

動作するInternet Explorer 11アドオンを作成する

私はVisual Studio 2017 CommunityC#。Net Framework 4.6.1。これらの手順の一部は、若干異なる場合があります。

ビルド後のスクリプトがBHOを登録できるようにAdministratorとしてVisual Studioを開く必要があります(レジストリアクセスが必要)。

クラスライブラリを作成することから始めます。私は私のInternetExplorerExtensionを呼び出しました。

これらの参照をプロジェクトに追加します。

  • Interop.SHDocVw:[COM]タブ/ "Microsoft Internet Controls"の検索
  • Microsoft.mshtml:[アセンブリ]タブ/ "Microsoft.mshtml"の検索

注:参照の追加ウィンドウでMSHTMLを見つけることができたにもかかわらず、どういうわけかMSHTMLがシステムに登録されませんでした。これにより、ビルド中にエラーが発生しました。

タイプライブラリ「MSHTML」のラッパーアセンブリが見つかりません

修正は http://techninotes.blogspot.com/2016/08/fixing-cannot-find-wrapper-Assembly-for.html にあります。または、このバッチスクリプトを実行できます。

"%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat"
cd "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\IDE\PublicAssemblies"
regasm Microsoft.mshtml.dll
gacutil /i Microsoft.mshtml.dll

次のファイルを作成します。

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
            {
                // @Eric Stob: Thanks for this hint!
                // This was used to prevent this method being executed more than once in IE8... but now it seems to not work anymore.
                //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
    }
}

Interop.cs

using System;
using System.Runtime.InteropServices;
namespace InternetExplorerExtension
{
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")]
    public interface IObjectWithSite
    {
        [PreserveSig]
        int SetSite([MarshalAs(UnmanagedType.IUnknown)]object site);
        [PreserveSig]
        int GetSite(ref Guid guid, [MarshalAs(UnmanagedType.IUnknown)]out IntPtr ppvSite);
    }


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct OLECMDTEXT
    {
        public uint cmdtextf;
        public uint cwActual;
        public uint cwBuf;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
        public char rgwz;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct OLECMD
    {
        public uint cmdID;
        public uint cmdf;
    }

    [ComImport(), ComVisible(true),
    Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"),
    InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IOleCommandTarget
    {

        [return: MarshalAs(UnmanagedType.I4)]
        [PreserveSig]
        int QueryStatus(
            [In] IntPtr pguidCmdGroup,
            [In, MarshalAs(UnmanagedType.U4)] uint cCmds,
            [In, Out, MarshalAs(UnmanagedType.Struct)] ref OLECMD prgCmds,
            //This parameter must be IntPtr, as it can be null
            [In, Out] IntPtr pCmdText);

        [return: MarshalAs(UnmanagedType.I4)]
        [PreserveSig]
        int Exec(
            //[In] ref Guid pguidCmdGroup,
            //have to be IntPtr, since null values are unacceptable
            //and null is used as default group!
            [In] IntPtr pguidCmdGroup,
            [In, MarshalAs(UnmanagedType.U4)] uint nCmdID,
            [In, MarshalAs(UnmanagedType.U4)] uint nCmdexecopt,
            [In] IntPtr pvaIn,
            [In, Out] IntPtr pvaOut);
    }
}

そして最後に、オプションを構成するために使用するフォーム。このフォームにTextBoxとOk Buttonを配置します。ボタンのDialogResultOkに設定します。このコードをフォームコードに配置します。

using System.Windows.Forms;
namespace InternetExplorerExtension
{
    public partial class HighlighterOptionsForm : Form
    {
        public HighlighterOptionsForm()
        {
            InitializeComponent();
        }

        public string InputText
        {
            get { return this.textBox1.Text; }
            set { this.textBox1.Text = value; }
        }
    }
}

プロジェクトのプロパティで、次を実行します。

  • 強力なキーでアセンブリに署名します。
  • [デバッグ]タブで、外部プログラムの開始C:\Program Files (x86)\Internet Explorer\iexplore.exeに設定します。
  • 「デバッグ」タブで、コマンドライン引数http://msdn.Microsoft.com/en-us/library/ms976373.aspx#bho_getintouchに設定します
  • [ビルドイベント]タブで、ビルド後のイベントコマンドラインを次のように設定します。

    "%ProgramFiles(x86)%\ Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\gacutil.exe"/f/i "$(TargetDir)$(TargetFileName)" 
     
     "%windir%\ Microsoft.NET\Framework\v4.0.30319\RegAsm.exe"/unregister "$(TargetDir)$(TargetFileName)" 
     
     "%windir%\ Microsoft .NET\Framework\v4.0.30319\RegAsm.exe "" $(TargetDir)$(TargetFileName) "

注意:私のコンピューターはx64ですが、非x64 gacutil.exeのパスを使用し、それが機能しました...特定のものx64の場合:

C:\ Program Files(x86)\ Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools \x64 \gacutil.exe

64bit IE64bitコンパイルおよび64bit登録BHOが必要です。 32ビットIE11を使用してしかデバッグできませんでしたが、32ビット登録済み拡張機能は64ビットIE11を実行しても機能しました。

この回答には、これに関する追加情報があるようです: https://stackoverflow.com/a/23004613/195417

必要な場合は、64ビットのレガズムを使用できます。

%windir%\ Microsoft.NET\Framework64 \v4.0.30319\RegAsm.exe

このアドオンの仕組み

アドオンの動作は変更しませんでした...説明については、以下のIE8セクションをご覧ください。


## IE8の以前の回答

男...これは大変な仕事です!私はこれをどうやってするのかとても興味があったので、自分でやりました。

まず第一に...クレジットはすべて私のものではありません。これは私がこれらのサイトで見つけたものの編集です:

そしてもちろん、あなたが尋ねた機能が私の答えにあったかったのです。

  • 何かを見つけるためのDOMトラバーサル。
  • ウィンドウを表示するボタン(私の場合はセットアップ)
  • 構成を保持します(そのためにレジストリを使用します)
  • 最後にjavascriptを実行します。

ステップごとに、Internet Explorer 8での作業をどうやって管理したかを、Windows 7で説明しますx64...他の構成ではテストできなかったことに注意してください。理解してほしい=)

動作するInternet Explorer 8アドオンを作成する

私はVisual Studio 2010C#4。Net Framework 4。したがって、これらの手順の一部は、若干異なる場合があります。

クラスライブラリを作成しました。私は私のInternetExplorerExtensionを呼び出しました。

これらの参照をプロジェクトに追加します。

  • Interop.SHDocVw
  • Microsoft.mshtml

注:これらの参照は、各コンピューターの異なる場所にある場合があります。

これは、csprojの参照セクションに含まれるものです。

<Reference Include="Interop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=90ba9c70f846762e, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <EmbedInteropTypes>True</EmbedInteropTypes>
  <HintPath>C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\Interop.SHDocVw.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
  <EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />

更新されたIE11ファイルと同じ方法でファイルを作成します。

IEAddon.cs

IE11バージョンから次の行のコメントを解除できます。

...
// @Eric Stob: Thanks for this hint!
// This was used to prevent this method being executed more than once in IE8... but now it seems to not work anymore.
if (pDisp != this.site)
    return;
...

Interop.cs

IE11バージョンと同じ。

そして最後に、オプションを構成するために使用するフォーム。このフォームにTextBoxとOk Buttonを配置します。ボタンのDialogResultOkに設定します。コードはIE11アドオンと同じです。

プロジェクトのプロパティで、次を実行します。

  • 強力なキーでアセンブリに署名します。
  • [デバッグ]タブで、外部プログラムの開始C:\Program Files (x86)\Internet Explorer\iexplore.exeに設定します。
  • 「デバッグ」タブで、コマンドライン引数http://msdn.Microsoft.com/en-us/library/ms976373.aspx#bho_getintouchに設定します
  • [ビルドイベント]タブで、ビルド後のイベントコマンドラインを次のように設定します。

    「C:\ Program Files(x86)\ Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools \x64\ gacutil.exe」/ f/i "$(TargetDir)$(TargetFileName)" 
     
     "C:\ Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe"/unregister "$(TargetDir) $(TargetFileName) "
     
    " C:\ Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "" $(TargetDir)$(TargetFileName) "

注意:私のコンピューターはx64であるため、私のマシンのgacutil実行可能ファイルのパス内に特定のx64がありますが、これは異なる場合があります。

64bit IE64bitコンパイルおよび64bit登録BHOが必要です。 64ビットRegAsm.exeを使用します(通常はC:\ Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exeにあります)

このアドオンの仕組み

すべてのDOMツリーを走査し、ボタンを使用して構成されたテキストを、それ自体が黄色の背景で置き換えます。黄色のテキストをクリックすると、ページに動的に挿入されたjavascript関数が呼び出されます。デフォルトのWordは「ブラウザ」であるため、それらの多くに一致します。 EDIT:強調表示する文字列を変更した後、URLボックスをクリックしてEnterキーを押す必要があります... F5は機能しません。 F5は「ナビゲーション」と見なされ、ナビゲーションイベントをリッスンする必要があるためです(おそらく)。後で修正しようとします。

今、それは行く時間です。私はとても疲れている。遠慮なく質問してください...旅行に行くので答えられないかもしれません... 3日後に戻ってきますが、その間ここに来ようとします。

223
Miguel Angelo

別のクールなアプローチは、チェックアウトすることです。

http://www.crossrider.org

これは、単一の共通JSコードを使用してIE、FF、およびChromeのブラウザー拡張機能を開発できるjqueryを使用したJSに基づくフレームワークです。基本的に、フレームワークはすべての厄介な作業を行い、アプリケーションコードを記述する必要があります。

13
Shaish

IE拡張の状態は実際にはかなり悲しいです。 IE5ブラウザーヘルパーオブジェクトの古いモデル(ええ、誰もが昔はブロックしたかった悪名高いBHO)、ツールバー、およびIE用の新しいアクセラレーターがあります。それでも、互換性は時々壊れます。私はIE7で壊れたIE6の拡張機能を維持していたので、変更されたことがいくつかあります。ほとんどの場合、私が知る限り(私は長年BHOに触れていません)、Active Template Libraries(MicrosoftのCOMのSTLのようなもの)を使用してそれらをコーディングする必要があります。 C#でCOM Interopを実行し、C#でそれを実行することはできますが、おそらく価値があるものには難しすぎます。とにかく、IEの独自の拡張機能のコーディングに興味がある場合(すべての主要なブラウザで拡張機能を利用できるようにする場合にもっともらしい)は、公式のMicrosoftリソースです。

http://msdn.Microsoft.com/en-us/library/aa753587(v = vs.85).aspx

IE8の新しいアクセラレータについては、これを確認できます。

http://msdn.Microsoft.com/en-us/library/cc289775(v = vs.85).aspx

ドキュメントがひどく、APIがかなり古いことに同意します。それでも、これが役立つことを願っています。

編集:ここで最後の情報源を1つ投げることができると思います。私は、BHOに取り組んでいたときに、背中のメモを調べていました。そして、これは私が彼らから始めた記事です。少し古いですが、IE BHO(たとえば、IObjectWithSite)を操作するときに使用するATLインターフェイスについては十分な説明があります。それはかなりよく説明されていて、当時私を大いに助けたと思います。 http://msdn.Microsoft.com/en-us/library/bb250436.aspx GregCが投稿した例を確認しました。少なくともIE8で動作し、VS 2010と互換性があります。C#を実行したい場合は、そこから始めてJon Skeet's Bookをご覧ください。 (C#in Depth 2nd edition)第13章には、COMとの相互作用をより良くするために使用できるC#4の新機能に関する多くの情報があります。 (C++でアドインを実行することをお勧めします)

11
cloudraven

C#BHOの開発は骨の折れる作業です。多くの厄介なCOMコードとp/invoke呼び出しが含まれます。

私はほとんど完成したC#BHO here を持っています。これは source を自由に使用できます。私は "mostly"と言います、なぜならIE保護モードでappdataを saveする方法がわからなかったからです

私はもう何年もIEのWebブラウザコントロールを使ってきましたが、その過程で役立つ名前が何度も​​何度も出てきました。IgorTandetnik

拡張機能を開発している場合、BHOをターゲットにして、次のグーグルを開始します。

BHOイゴールタンデトニク

OR

ブラウザヘルパーオブジェクトIgor Tandetnik

彼の投稿はしばしば非常に詳細であり、彼が何について話しているかを知っています。

COMおよびATLプログラミングであなたの耳に触れることができます。サンプルのウォークスルーについては、以下を確認してください。 http://msdn.Microsoft.com/en-us/library/ms976373.aspx

5
Lynn Crumbling

明らかに解決されていますが、他のユーザーにはSpicIE frameworkをお勧めします。それに基づいて独自の拡張機能を作成しました。 Internet Explorer 7/8を公式にサポートするだけですが、私はInternet Explorer 6-10でテスト済み(Windows XPからWindows 8 Consumer Previewまで)およびそれ動作しますfine。残念ながら、最新リリースにはいくつかのバグがあったため、修正して独自のリリースを作成する必要がありました。 http://archive.msdn.Microsoft.com/SpicIE/Thread/View.aspx?ThreadId=5251

3
Pěna

車輪の再発明を試みていない場合は、 IE用Expressに追加 を試してみてください。 VSTO stuff に製品を使用しましたが、かなり良いです。また、有用なフォーラムと迅速なサポートも提供しています。

3
Sujay Ghosh

Robert Harveyに同意します。C#4.0ではCOM相互運用性が向上しています。書き換えが必要な、古いC#コードが少しあります。

http://www.codeproject.com/KB/cs/Attach_BHO_with_C_.aspx

これは、ATLを回避してSpartan COMを使用することにより、物事を単純化する試みです。

BHOを取得するためのC++およびCOM

3
GregC

2002年に公開されたこのPavel Zolnikovの投稿をお勧めします。

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

Bandオブジェクトの使用に基づいており、.Net 2.0を使用してコンパイルされます。ソースコードが提供され、Visual Studio 2013で正常に開いてコンパイルされます。投稿のコメントで読むように、IE 11およびWindows 7およびWindows 10で完全に動作します。 Windows 7 + SP1およびIE 11お楽しみください!

0
Marc Charmois