208

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

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

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

編集、さらに詳細:

理想的には、クリックすると外部サイトへのリンクを含むメニューがポップアップするツールバー ボタンを植えたいと思います。また、条件によっては DOM にアクセスし、ページに JavaScript を植え付けたいと考えています。

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

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

4

11 に答える 11

229

[更新] Visual Studio 2017 Communityを使用したWindows 10 x64のInternet Explorer 11で動作するように、この回答を更新しています。この回答の以前のバージョン (Windows 7 x64 および Visual Studio 2010 の Internet Explorer 8 の場合) は、この回答の最後にあります。

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

私はVisual Studio 2017 CommunityC#.Net Framework 4.6.1を使用しているため、これらの手順の一部が若干異なる場合があります。

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

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

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

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

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

タイプ ライブラリ "MS​​HTML" のラッパー アセンブリが見つかりません

修正プログラムは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
    }
}

相互運用.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);
    }
}

最後に、オプションの設定に使用するフォームです。このフォームに aTextBoxと 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 が必要です。32bit IE11でしかデバッグできませんでしたが、64bit IE11でも32bit登録拡張機能が動作しました。

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

必要に応じて、64 ビット regasm を使用できます。

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

このアドオンの仕組み

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


## IE8 の以前の回答

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

まず第一に...信用は私のすべてではありません。これは、これらのサイトで見つけたものをまとめたものです。

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

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

Windows 7 x64のInternet 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;
...

相互運用.cs

IE11版と同じ。

最後に、オプションの設定に使用するフォームです。このフォームに aTextBoxと 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日で戻ってきますが、それまでにここに来るようにします。

于 2011-04-21T05:37:53.617 に答える
12

IE 拡張機能の状態は、実際にはかなり悲しいものです。古いモデルの IE5 ブラウザー ヘルパー オブジェクト (そうです、昔は誰もがブロックするのが好きだった悪名高い BHO)、ツールバー、IE 用の新しいアクセラレータがあります。それでも、互換性が壊れることがあります。以前は IE7 で壊れた IE6 の拡張機能を維持していたので、いくつか変更されています。ほとんどの場合、私が知る限り (私は何年も BHO に触れていません)、Active Template Libraries (Microsoft の COM の STL のようなもの) を使用してそれらをコーディングする必要があります。C# で COM Interop を実行し、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 がかなり古くなっていることに同意します。それでも、これが役立つことを願っています。

編集:ここで最後の情報源を投げることができると思います。BHOに取り組んでいたときのメモを調べていました。そして、これは私がそれらを始めるきっかけとなった記事です. 少し古いですが、IE BHO (IObjectWithSite など) を操作するときに使用する ATL インターフェイスについて適切に説明しています。とても丁寧に説明していただき、大変参考になったと思います。 http://msdn.microsoft.com/en-us/library/bb250436.aspx GregC が投稿した例も確認しました。少なくとも IE8 で動作し、VS 2010 と互換性があるため、C# を使用する場合は、Jon Skeet の本を参照してください。(C# の詳細第 2 版) 第 13 章には、C# 4 の新機能に関する多くの情報があり、COM とのやり取りをより快適にするために使用できます。(C++ でアドインを作成することをお勧めします)

于 2011-04-13T16:44:44.553 に答える
12

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

http://www.crossrider.org

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

于 2011-12-12T15:57:26.630 に答える
6

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

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

于 2011-04-16T03:51:58.213 に答える
4

私は何年もの間 IE の Web ブラウザー コントロールを使用してきましたが、その過程で 1 つの名前が有益な投稿で何度も何度も出てきます: Igor Tandetnik

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

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

また

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

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

COM および ATL プログラミングについては、耳を傾ける必要があります。サンプルのチュートリアルについては、http: //msdn.microsoft.com/en-us/library/ms976373.aspxをご覧ください。

于 2011-04-16T03:55:12.100 に答える
3

車輪の再発明を試みていない場合は、Add In Express for IE を試すことができます。私はVSTOのものに製品を使用しましたが、かなり良いです. また、役立つフォーラムと迅速なサポートもあります。

于 2011-04-19T08:29:25.817 に答える
3

Robert Harvey に同意します。C# 4.0 では COM 相互運用性が改善されました。これは少し古い C# コードで、どうしても書き直す必要があります。

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

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

C++ と COM による BHO の実行

于 2011-04-16T04:22:05.630 に答える
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

于 2012-05-04T23:05:04.373 に答える
0

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 エンジョイ!

于 2016-09-07T12:53:51.297 に答える
-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)"
于 2013-07-26T07:32:10.347 に答える