Internet Explorer拡張機能の開発を開始するにはどうすればよいですか?


207

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

私は本当にこれをやりたいのですが、お粗末なドキュメント、お粗末なコード/サンプルコード/その欠如で巨大な壁にぶつかっています。あなたが提供できるどんなヘルプ/リソースも大いに感謝されます。

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

編集、さらに詳細:

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

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

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


1
IMHO IE 9は、以前のバージョンよりも桁違いに優れています。(もちろん、Chrome for IEはそのままにしておきます...とにかくまだです。)
user541686

1
@アレックス:どのようなことをIEで実装することを想定して、正しい一般的な方向に掘り始められるようにしますか?
GregC、2011

@アレックス:この問題を扱いやすい部分に分解するために、私は次のことを知る必要があります:エンドユーザーがIE9を実行していて、dotNET 4.0ランタイムをインストールしてもよいと想定できますか?
GregC 2011

GregCに同意します。ここでさらに情報が役立ちます。ツールバーのようなもの、またはユーザーが閲覧しているものを前処理するもの、またはサードパーティのサービスに接続するものを考えていますか?
cloudraven

4
@Alex、見とるCrossriderを。それはあなたの人生をはるかに容易にします。
shdev

回答:


229

[UPDATE]私はで動作するように、この答えを更新してるのInternet Explorer 11には、Windowsの10のx64のVisual Studio 2017コミュニティ。この回答の以前のバージョン(Windows 7 x64およびVisual Studio 2010のInternet Explorer 8の場合)は、この回答の下部にあります。

機能するInternet Explorer 11アドオンの作成

私が使用していますのVisual Studio 2017コミュニティC# .NET Frameworkの4.6.1を、ので、これらのステップのいくつかは、あなたのために、わずかに異なる場合があります。

あなたはする必要があり、管理者としてのVisual Studioを開き、ビルド後のスクリプトはBHO(レジストリへのアクセスを必要とする)を登録することができそうという、ソリューションを構築します。

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

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

  • Interop.SHDocVw:COMタブ/検索 "Microsoft Internet Controls"
  • Microsoft.mshtml:[アセンブリ]タブ/検索 "Microsoft.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);
    }
}

最後に、オプションを構成するために使用するフォーム。この形式では、a 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

64ビットIEには、64ビットでコンパイルされ、64ビットで登録されたBHOが必要です。私は32ビットIE11を使用してのみデバッグできましたが、32ビット登録拡張機能は64ビットIE11を実行することでも機能しました。

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

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

%windir%\ Microsoft.NET \ Framework 64 \ v4.0.30319 \ RegAsm.exe

このアドオンのしくみ

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


## IE8の以前の回答

男…これは大変な仕事です!これをどうやってやるのか気になったので、自分でやった。

まず第一に...クレジットは私のものではありません。これは、これらのサイトで私が見つけたものをまとめたものです。

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

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

Windows 7 x64Internet Explorer 8を使用してそれをどのように管理できたかを段階的に説明します ...他の構成ではテストできなかったことに注意してください。理解してほしい=)

機能する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バージョンと同じ。

最後に、オプションを構成するために使用するフォーム。この形式では、a 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があります。

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

このアドオンのしくみ

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

さあ、行く時間です。私はとても疲れている。遠慮なく質問してください…旅行に行っているので返答できないかもしれません…3日で帰ってきましたが、とりあえずここに来てみます。


2
こんにちは、私は答えで説明されていることを正確に行いました。ボタンが表示されます。exec関数が実行されます。ただし、SetSite関数とGetSite関数が呼び出されることはありません。表示しているページのURLを知りたい。ブラウザを初期化するためにこれらのメソッドを呼び出すことができません。助けてください
mustafabar

3
IE9でこれを実行しようとしました。1。プロジェクトパスにスペースがある場合:$(TargetDir)$(TargetFileName)使用する代わりに"$(TargetDir)$(TargetFileName)" 2. Visual Studio 2010 Expressを使用する場合、おそらく(私は)[デバッグ]タブに[ 外部プログラム開始 ]オプションが表示されません。IEを実行して、提供されたURL 3 移動するだけです
。IE9

8
Interop.SHDocVw参照の場合-COM参照を "Microsoft Internet Controls"に追加してから、 "SHDocVwを使用する"必要があります。
Eric Hartford

8
「x64 Windows 8上のIE10は、「任意のCPU」アーキテクチャでビルドし、32ビットと64ビットの両方のRegAsm.exeを使用して登録しない限り、起動時にアドオンをロードしません。」却下された誰かによる編集でした。
Matsemann 2013年

3
フォローアップを参照してください。stackoverflow.com/questions/22953571/...

12

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

http://www.crossrider.org

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


ええ、これは実際に進むべき道であり、ビジュアルスタジオでプラグインを開発するという悪夢を回避することもできます。つまり、すべてのブラウザーでプラグインを1回記述するだけで済みます。また、Macユーザーであれば、仮想マシンで開発する必要がないことも意味します。
opsb 2013

11

IE拡張機能の状態は実際にはかなり悲しいです。IE5ブラウザーヘルパーオブジェクトの古いモデル(そう、悪名高いBHOであり、誰もが当時ブロックするのが好きでした)、ツールバー、およびIEの新しいアクセラレーターがあります。それでも互換性が失われることがあります。以前はIE7で機能しなかったIE6の拡張機能を維持していたため、変更された点がいくつかあります。ほとんどの場合、私が知る限り(私は何年もBHOに触れていません)、Active Template Libraries(MicrosoftのCOMのSTLのようなもの)を使用してコーディングする必要があり、C ++の場合のみです。COM相互運用機能をC#で実行し、C#でそれをやめることもできますが、その価値に見合うだけのことは難しいでしょう。とにかく、

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を確認できます。(Cp in Depth 2nd edition)第13章には、COMとの相互作用をより良くするために使用できるC#4の新機能に関する多くの情報があります。(C ++でアドインを実行することをお勧めします)


6

C#BHOの開発は、苦痛を伴うものです。それは多くの厄介なCOMコードとp / invoke呼び出しを含みます。

私はここでほぼ完成したC#BHOを持っています。これは、ソースを自由に使用て好きなものにできます。IE保護モードでappdata保存する方法がわからなかったので、「ほぼ」と言います


4
COM相互運用機能が大幅に改善されているため、C#4.0の方がこの点で優れています。
Robert Harvey、

@ロバート:本当に?わからなかった...違いは何ですか?
user541686 2011

@Mehrdad:あなたはここに違いの味を得ることができます:devx.com/dotnet/Article/42590/1954を。詳細については、Anders Hejlsbergの講演「The Future of C#」を参照してください。ここでは、channel9.msdn.com
Robert Harvey

1
@Robert @Mehrdad:そうではありません。(この点で)厄介なのはCOM相互運用機能ではなく、新しいC#4.0機能が役に立たないCOMモジュールを開発および登録することです。
BlueRaja-Danny Pflughoeft、2011

4

私は何年もの間IEのwebbrowserコントロールを操作してきましたが、その過程で、役立つ投稿で1つの名前が何度も​​何度も登場します。IgorTandetnik

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

BHOイゴールタンデトニック

または

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

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

COMやATLプログラミングに耳を傾けるでしょう。ウォークスルーのサンプルについては、以下を確認してください。http//msdn.microsoft.com/en-us/library/ms976373.aspx


C#を使用する最大の欠点(これは、他のほとんどのポスターが進んでいる方向です)は、C ++にネイティブになるコードの回避策とパッチを使用して、あらゆる種類の追加レイヤーを通過することです。
Lynn Crumbling 2011



3

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


0

2002年に公開されたパベルゾルニコフのこの投稿を温かくお勧めします。

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で完全に機能します。Windows7 + SP1とIEで完全に機能しました11お楽しみください!


回答はStackOverflowに自己完結するようにしてください。この投稿はすべて、「Bandオブジェクトと.Net 2.0を使用する」ことを私に本当に伝えています。ここにサンプルコードを含めて、それがどのように行われるかを示していただけませんか?
Teepeemm 2016

0

質問は2013年からですが、今は2020年ですが、将来の訪問者にとって役立つかもしれません。

@Miguel Angeloの回答を実装しようとしましたが、最初は機能しませんでした。

まだいくつかの設定が定義されています。

Internet Explorer(IE-11を使用)に移動しTools-->Internet Options-->Advancedます。 ここに画像の説明を入力してください

ここに画像の説明を入力してください

このSOの質問githubのこの例も参照してください


-2

ここに画像の説明を入力してください

[ビルドイベント]タブで、[ビルド後のイベント]コマンドラインを(x64)に設定します。

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\gacutil.exe" /if "$(TargetDir)$(TargetFileName)"    
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" /u "$(TargetDir)$(TargetFileName)"    
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" "$(TargetDir)$(TargetFileName)"

[ビルドイベント]タブが必要です。[ビルド後のイベント]コマンドラインを(32ビットオペレーティングシステム)に設定します

"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\gacutil.exe" /if "$(TargetDir)$(TargetFileName)"    
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" /u "$(TargetDir)$(TargetFileName)"    
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "$(TargetDir)$(TargetFileName)"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.