web-dev-qa-db-fra.com

Comment démarrer avec le développement d'extensions Internet Explorer?

Est-ce que quelqu'un ici a de l'expérience dans le développement d'extensions IE pouvant partager ses connaissances? Cela inclurait des exemples de code, des liens vers de bons exemples, de la documentation sur le processus ou autre.

Je veux vraiment faire cela, mais je me heurte à un mur géant avec une documentation moche, un code moche/exemple de code/son absence. Toute aide/ressources que vous pourriez offrir serait grandement appréciée.

Plus précisément, je voudrais commencer par savoir comment accéder à/manipuler le DOM à partir d’une extension IE. 

EDIT, encore plus de détails:

Idéalement, j'aimerais planter un bouton dans la barre d'outils qui, une fois cliqué dessus, a fait apparaître un menu contenant des liens vers des sites externes. Je souhaite également accéder au DOM et à l’installation de JavaScript sur la page en fonction de certaines conditions. 

Quel est le meilleur moyen de conserver des informations dans une extension IE? Dans Firefox/Chrome/La plupart des navigateurs modernes, vous utilisez window.localStorage, mais évidemment avec IE8/IE7, ce n'est pas une option. Peut-être une base de données SQLite ou autre? Peut-on supposer que .NET 4.0 sera installé sur l'ordinateur de l'utilisateur?

Je ne veux pas utiliser Spice IE, je veux aussi en construire un qui soit compatible avec IE9. J'ai également ajouté la balise C++ à cette question, car s'il est préférable d'en créer une en C++, je peux le faire. 

201
Alex

[UPDATE] Je mets à jour cette réponse pour qu'elle fonctionne avec Internet Explorer 11 , sous Windows 10 x64 avec la communauté Visual Studio 2017 . La version précédente de cette réponse (pour Internet Explorer 8, Windows 7 x64 et Visual Studio 2010) se trouve au bas de cette réponse.

Création d'un module complémentaire Internet Explorer 11 de travail

J'utilise la communauté Visual Studio 2017 , C # , . Net Framework 4.6.1 , certaines de ces étapes peuvent donc être légèrement différentes pour vous.

Vous devez ouvrir Visual Studio en tant qu'administrateur pour générer la solution, afin que le script de post-génération puisse enregistrer le BHO (nécessite un accès au registre).

Commencez par créer une bibliothèque de classes. J'ai appelé le mien InternetExplorerExtension .

Ajoutez ces références au projet:

  • Interop.SHDocVw: onglet COM/recherchez "Microsoft Internet Controls"
  • Microsoft.mshtml: onglet Assemblies/recherche de "Microsoft.mshtml"

Remarque: MSHTML n'était pas enregistré dans mon système, même si je pouvais le trouver dans la fenêtre Ajouter une référence. Cela a provoqué une erreur lors de la construction:

Impossible de trouver l'assembly wrapper pour la bibliothèque de types "MSHTML"

Le correctif est disponible à l'adresse http: //techninotes.blogspot.com/2016/08/fixing-cannot-find-wrapper-Assembly-for.html ou vous pouvez exécuter ce script batch:

"%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

Créez les fichiers suivants:

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);
    }
}

et enfin un formulaire que nous utiliserons pour configurer les options. Dans cette forme, placez une TextBox et un Ok Button. Définissez le DialogResult du bouton sur Ok . Placez ce code dans le code du formulaire:

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; }
        }
    }
}

Dans les propriétés du projet, procédez comme suit:

  • Signez l’Assemblée avec une clé forte;
  • Dans l'onglet Débogage, définissez Démarrer le programme externe sur C:\Program Files (x86)\Internet Explorer\iexplore.exe.
  • Dans l'onglet Débogage, définissez Arguments de la ligne de commande sur http://msdn.Microsoft.com/en-us/library/ms976373.aspx#bho_getintouch.
  • Dans l'onglet Événements de construction, définissez la ligne de commande des événements post-construction sur:

    "% ProgramFiles (x86)%\SDK Microsoft\Windows\v10.0A\bin\NETFX 4.6.1 Outils\gacutil.exe"/f/i "$ (TargetDir) $ (TargetFileName)" "
     
     "% windir%\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe"/annuler l'inscription "$ (TargetDir) $ (TargetFileName)" 
     
     "% windir%\Microsoft .NET\Framework\v4.0.30319\RegAsm.exe "" $ (TargetDir) $ (TargetFileName) "

Attention: même si mon ordinateur est en x64, j'ai utilisé le chemin d'accès du non-x64 gacutil.exe et cela a fonctionné ... le spécifique pour x64 est à:

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

IE 64 bits Nécessite un BHO compilé et enregistré à 64 bits. Bien que je ne puisse déboguer qu'avec IE11 32 bits, l'extension enregistrée 32 bits fonctionnait également en exécutant IE11 64 bits.

Cette réponse semble contenir des informations supplémentaires à ce sujet: https: //stackoverflow.com/a/23004613/195417

Si vous en avez besoin, vous pouvez utiliser le regasm 64bit:

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

Comment fonctionne cet add-on

Je n'ai pas changé le comportement de l'add-on ... jetez un coup d'œil à la section IE8 ci-dessous pour obtenir une description.


## Previous Answer for IE8

Man ... cela a été beaucoup de travail! J'étais tellement curieux de savoir comment faire cela, que je l'ai fait moi-même.

Tout d'abord ... le crédit n'est pas tout à moi. Voici une compilation de ce que j'ai trouvé sur ces sites:

Et bien sûr, je voulais ma réponse pour avoir les fonctionnalités que vous avez demandé:

  • DOM traversal pour trouver quelque chose;
  • un bouton qui affiche une fenêtre (dans mon cas, à configurer)
  • persiste la configuration (je vais utiliser le registre pour ça)
  • et enfin exécuter javascript.

Je vais le décrire étape par étape et expliquer comment j’ai réussi à le faire avec Internet Explorer 8 , sous Windows 7. x64 ... notez que je ne pouvais pas tester dans d'autres configurations. J'espère que vous comprenez =)

Création d'un module complémentaire Internet Explorer 8 de travail

J'utilise Visual Studio 2010 , C # 4 , . Net Framework 4 , certaines de ces étapes pourraient donc être légèrement différentes pour vous.

Créé une bibliothèque de classe. J'ai appelé le mien InternetExplorerExtension .

Ajoutez ces références au projet:

  • Interop.SHDocVw
  • Microsoft.mshtml

Remarque: ces références peuvent figurer à des emplacements différents sur chaque ordinateur.

voici ce que ma section de références dans csproj contient:

<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" />

Créez les fichiers de la même manière que les fichiers IE11 mis à jour.

IEAddon.cs

Vous pouvez supprimer les commentaires des lignes suivantes de la version 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

Identique à la version IE11.

et enfin un formulaire que nous utiliserons pour configurer les options. Dans cette forme, placez une TextBox et un Ok Button. Définissez le DialogResult du bouton sur Ok . Le code est le même pour le complément IE11.

Dans les propriétés du projet, procédez comme suit:

  • Signez l’Assemblée avec une clé forte;
  • Dans l'onglet Débogage, définissez Démarrer le programme externe sur C:\Program Files (x86)\Internet Explorer\iexplore.exe.
  • Dans l'onglet Débogage, définissez Arguments de la ligne de commande sur http://msdn.Microsoft.com/en-us/library/ms976373.aspx#bho_getintouch.
  • Dans l'onglet Événements de construction, définissez la ligne de commande des événements post-construction sur:

    "C:\Fichiers de programme (x86)\SDK Microsoft\Windows\v7.0A\Bin\Outils NETFX 4.0\ x64 \gacutil.exe"/f/i "$ (TargetDir) $ (TargetFileName)" "
     
    " C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "/ désinscrire" $ (TargetDir) $ (TargetFileName) "
     
    " C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe "" $ (TargetDir) $ (TargetFileName) "

Attention: mon ordinateur étant en x64, il existe un x64 spécifique dans le chemin de l'exécutable gacutil sur ma machine qui peut être différent sur le vôtre.

IE 64 bits Nécessite un BHO compilé et enregistré à 64 bits. Utilisez RegAsm.exe 64 bits (réside généralement dans C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe)

Comment fonctionne cet add-on

Il traverse toutes les arborescences DOM en remplaçant le texte, configuré à l'aide du bouton, par un arrière-plan jaune. Si vous cliquez sur les textes en jaune, il appelle une fonction javascript insérée dynamiquement sur la page. Le mot par défaut est 'navigateur', de sorte qu'il en correspond à beaucoup! EDIT: après avoir modifié la chaîne à mettre en surbrillance, vous devez cliquer sur la case URL et appuyer sur Entrée ... F5 ne fonctionnera pas, je pense que c'est le cas parce que F5 est considéré comme une 'navigation' et qu'il faudrait écouter pour naviguer entre les événements (peut-être). Je vais essayer de résoudre ce problème plus tard.

Maintenant, il est temps d'y aller. Je suis très fatigué. N'hésitez pas à poser des questions ... peut-être que je ne serai pas en mesure de vous répondre car je pars en voyage ... je suis de retour dans 3 jours, mais je vais essayer de venir ici d'ici-là.

223
Miguel Angelo

Une autre approche intéressante serait de vérifier:

http://www.crossrider.org

C'est un framework basé sur JS avec jquery qui vous permet de développer des extensions de navigateurs pour IE, FF et Chrome à l'aide d'un seul code JS commun. En gros, le framework fait tout le travail et il ne vous reste plus qu’écrire votre code applicatif.

13
Shaish

L'état des extensions IE est en réalité assez triste. Vous avez l'ancien modèle de Helper Browser IE5 (oui, ces fameux BHO que tout le monde aimait bloquer dans la journée), les barres d'outils et les nouveaux accélérateurs pour IE . Même dans ce cas, la compatibilité peut être rompue. J'avais l'habitude de maintenir une extension pour IE6 cassée avec IE7, donc certaines choses ont changé. Pour la plupart, pour autant que je sache (je n'ai pas touché aux BHO depuis des années), vous devez toujours les coder à l'aide de bibliothèques de modèles actifs (un peu comme une STL pour COM de Microsoft) et, en tant que tel, uniquement pour C++. Vous pouvez faire COM Interop avec C # et vous en sortir en C # mais ça va probablement être trop dur pour ce que ça vaut . Quoi qu'il en soit, si vous êtes intéressé par le codage de votre propre extension pour IE (ce qui est plausible si vous souhaitez que vos extensions soient disponibles dans tous les principaux navigateurs), voici les ressources officielles de Microsoft.

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

Et pour les accélérateurs nouveaux dans IE8, vous pouvez vérifier celui-ci.

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

Je conviens que la documentation est terrible et que les API sont plutôt obsolètes. J'espère toujours que cela aide.

EDIT: Je suppose que je peux jeter une dernière source d’information ici. Je parcourais mes notes de dos lorsque je travaillais sur des BHO. Et c'est l'article qui m'a permis de commencer avec eux. C'est un peu vieux, mais a une bonne explication des interfaces ATL que vous utiliserez lorsque vous travaillerez avec des BHO IE (IObjectWithSite par exemple). Je pense que cela a été assez bien expliqué et m'a beaucoup aidé à l'époque . http://msdn.Microsoft.com/en-us/library/bb250436.aspx J'ai également vérifié l'exemple que GregC a posté. Cela fonctionne avec au moins IE8, et il est compatible avec VS 2010, donc si vous voulez faire du C #, vous pouvez vous y lancer et jeter un coup d'œil au livre de Jon Skeet. (C # in Depth 2nd edition) Le chapitre 13 contient de nombreuses informations sur les nouvelles fonctionnalités de C # 4 que vous pouvez utiliser pour rendre l'interaction avec COM plus agréable. (Je vous recommanderais quand même de faire votre complément en C++)

11
cloudraven

Développer des BHO en C # est une douleur dans le cul. Cela implique beaucoup de code COM icky et d'appels p/invoke.

J'ai un C # BHO ici presque fini, que vous êtes libre d'utiliser la source pour ce que vous voulez. Je dis "généralement", car je n'ai jamais trouvé comment enregistrer les données d'application sous IE en mode protégé }.

Cela fait des années que je travaille avec le contrôle des navigateurs Web d'IE. Au fil de ces expériences, un nom est mentionné à maintes reprises avec des messages utiles: Igor Tandetnik

Si je développais une extension, je ciblerais un BHO et commencerais à googler pour:

BHO Igor Tandetnik

OR

Objet d'assistance de navigateur Igor Tandetnik

Ses messages sont souvent très détaillés et il sait de quoi il parle.

Vous allez vous retrouver à la hauteur des oreilles dans les programmes COM et ATL. Pour un exemple de procédure pas à pas, consultez: http://msdn.Microsoft.com/en-us/library/ms976373.aspx

5
Lynn Crumbling

Il est évidemment résolu, mais pour les autres utilisateurs, je recommanderais le framework SpicIE. J'ai fait ma propre extension sur cette base. Il ne prend en charge que officiellement Internet Explorer 7/8, mais j'ai testé cela sous Internet Explorer 6-10 (de Windows XP à Windows 8 Consumer Preview) et il fonctionne correctement . Malheureusement, la dernière version contenait des bogues. J'ai donc dû les corriger et créer ma propre version: http://archive.msdn.Microsoft.com/SpicIE/Thread/View.aspx?ThreadId=5251

3
Pěna

Si vous n'essayez pas de réinventer la roue, vous pouvez essayer Add In Express pour IE . J'ai utilisé le produit pour le VSTO , et c'est très bon. En outre, ils ont un forum utile et un support rapide.

3
Sujay Ghosh

Je suis d'accord avec Robert Harvey, le C # 4.0 offre une meilleure interopérabilité COM. Voici un peu de code C # plus ancien, qui a désespérément besoin d'être réécrit.

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

Ceci est une tentative pour simplifier les choses en évitant ATL et en utilisant Spartan COM:

C++ et COM pour lancer les BHO

3
GregC

Je vous suggère chaudement ce post de Pavel Zolnikov publié en 2002!

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

Il est basé sur l'utilisation d'objets Band et est compilé à l'aide de .Net 2.0. Le code source est fourni et s'ouvre et compile bien avec Visual Studio 2013 . Comme vous le lirez dans les commentaires de l'article, il fonctionne parfaitement pour IE 11 et sous Windows 7 et Windows 10. Cela a parfaitement fonctionné pour moi sous Windows 7 + SP1 et IE 11 Enjoy!

0
Marc Charmois