Як почати розробку розширень Internet Explorer?


207

Хтось тут має досвід розробки розширень IE, які можуть поділитися своїми знаннями? Це може включати зразки коду, посилання на хороші, або документацію про процес, або щось інше.

Я дуже хочу це зробити, але я потрапляю у гігантську стіну з паршивою документацією, паршивим кодом / прикладом коду / відсутністю. Будь-яка допомога / ресурси, які ви могли б запропонувати, буде дуже вдячна.

Зокрема, я хотів би почати з того, як отримати доступ до DOM / маніпулювати з ним у межах розширення IE.

EDIT, ще більше деталей:

В ідеалі я хотів би встановити кнопку панелі інструментів, яка при натисканні на неї вискакує меню вгору, яке містить посилання на зовнішні сайти. Я також хотів би отримати доступ до DOM та встановити JavaScript на сторінці залежно від деяких умов.

Який найкращий спосіб зберегти інформацію в розширенні IE? У Firefox / Chrome / Більшій частині сучасних браузерів ви користуєтесь window.localStorage, але, очевидно, з IE8 / IE7, це не варіант. Може бути, SQLite DB або таке? Цілком припустити, що .NET 4.0 буде встановлений на комп'ютері користувача?

Я не хочу використовувати Spice IE, оскільки я хочу створити той, який також сумісний з IE9. До цього питання я також додав тег C ++, тому що якщо краще створити його на C ++, я можу це зробити.


1
IMHO IE 9 на порядок кращий, ніж попередні версії. (Не те, що я залишу Chrome для IE, звичайно ... ще не все одно.)
user541686

1
@ Алекс: які речі ви передбачаєте впроваджувати в IE, щоб ми могли почати копати у правильному загальному напрямку?
GregC

@Alex: Щоб розбити цю проблему на керовані частини, мені потрібно знати наступне: чи можна вважати, що кінцевий користувач буде працювати IE9 і буде готовий встановити час виконання dotNET 4.0?
GregC

Я згоден з GregC. Тут допоможе трохи більше інформації. Ви думаєте про щось на зразок панелі інструментів, або, можливо, щось, що попередньо обробить те, що користувач переглядає, або щось, що підключиться до сторонньої служби
хмаравен

4
@ Алекс, поглянь на Crossrider . Це значно полегшить ваше життя.
шдев

Відповіді:


229

[ОНОВЛЕННЯ] Цю відповідь я оновлюю для роботи з Internet Explorer 11 , в Windows 10 x64 із спільнотою Visual Studio 2017 . Попередня версія цієї відповіді (для Internet Explorer 8, в Windows 7 x64 та Visual Studio 2010) знаходиться внизу цієї відповіді.

Створення робочого додатка Internet Explorer 11

Я використовую Visual Studio 2017 Community , 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);
    }
}

і нарешті форма, яку ми будемо використовувати для налаштування параметрів. У цій формі поставте а TextBoxта Ок Button. Встановіть кнопку DialogResult на Ок . Розмістіть цей код у коді форми:

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 Інструменти \ gacutil.exe" / f / i "$ (TargetDir) $ (TargetFileName)"
    
    "% windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ RegAsm.exe" / скасувати реєстрацію "$ (TargetDir) $ (TargetFileName)"
    
    "% windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ RegAsm.exe" "$ (TargetDir) $ (TargetFileName)"

Увага: незважаючи на те, що мій комп'ютер x64, я використовував шлях не-x64, gacutil.exeі він працював ... специфічний для x64:

C: \ Програмні файли (x86) \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Інструменти \ x64 \ gacutil.exe

64-бітний IE потребує 64-бітового компільованого та 64-бітового реєстрації BHO. Хоча я міг налагоджувати лише за допомогою 32-бітового IE11, 32-бітове зареєстроване розширення також працювало за допомогою 64-бітного IE11.

Здається, у цій відповіді є додаткова інформація про це: https://stackoverflow.com/a/23004613/195417

Якщо вам потрібно, ви можете використовувати 64-бітовий регазм:

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

Як працює ця надбудова

Я не змінив поведінку надбудови ... подивіться нижче на опис IE8.


Попередній відповідь для IE8

Людина ... над цим було багато роботи! Мені було так цікаво, як це зробити, що я це зробив сам.

Перш за все ... кредит - це не все моє. Це збірка того, що я знайшов на цих сайтах:

І звичайно, я хотів, щоб моя відповідь мала функції, про які ви питали:

  • Обхід DOM, щоб знайти щось;
  • кнопка, що показує вікно (у моєму випадку для налаштування)
  • зберегти конфігурацію (я буду використовувати для цього реєстр)
  • і нарешті виконати JavaScript.

Я опишу це крок за кроком, як мені вдалося це зробити, працюючи з Internet Explorer 8 , в Windows 7 x64 ... зауважте, що я не міг протестувати в інших конфігураціях. Сподіваюся, ви зрозуміли =)

Створення робочого додатка Internet Explorer 8

Я використовую Visual Studio 2010 , C # 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та Ок Button. Встановіть кнопку DialogResult на Ок . Код такий самий для IE11 аддона.

У властивостях проекту виконайте наступне:

  • Підпишіть збірку за допомогою кнопок;
  • На вкладці «Налагодження» встановіть « Запустити зовнішню програму» наC:\Program Files (x86)\Internet Explorer\iexplore.exe
  • На вкладці Налагодження встановіть Аргументи командного рядка наhttp://msdn.microsoft.com/en-us/library/ms976373.aspx#bho_getintouch
  • На вкладці "Події збирання" встановіть командний рядок " Події після збирання" на:

    "C: \ Файли програми (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ NETFX 4.0 Інструменти \ x64 \ gacutil.exe" / f / i "$ (TargetDir) $ (TargetFileName)"
    
    "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ RegAsm.exe" / скасувати реєстрацію "$ (TargetDir) $ (TargetFileName)"
    
    "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ RegAsm.exe" "$ (TargetDir) $ (TargetFileName)"

Увага: оскільки мій комп’ютер x64, всередині шляху моєї машини, що виконується, є специфічний x64, який може відрізнятись від вашого.

64-бітний IE потребує 64-бітового компільованого та 64-бітового реєстрації BHO. Використовуйте 64-бітний RegAsm.exe (зазвичай живе в C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ RegAsm.exe)

Як працює ця надбудова

Він обходить все дерево DOM, замінюючи текст, налаштований за допомогою кнопки, самим жовтим фоном. Якщо натиснути на пожовклі тексти, він викликає функцію javascript, яка була вставлена ​​на сторінку динамічно. За замовчуванням слово "браузер", так що воно відповідає багатьом! EDIT: після зміни рядка для виділення потрібно натиснути поле URL-адреси та натиснути Enter ... F5 не працюватиме, я думаю, що це тому, що F5 вважається "навігацією", і це вимагатиме прослуховування події навігації (може бути). Спробую це виправити пізніше.

Тепер пора йти. Я дуже втомився. Не соромтеся задавати питання ... можливо, я не зможу відповісти, оскільки їду в подорож ... через 3 дні я повернувся, але тим часом спробую приїхати сюди.


2
Привіт, я зробив саме те, що описано у відповіді. З'являється кнопка. Функція exec виконується. Однак функції SetSite та GetSite ніколи не викликаються. Я хочу бути в змозі знати URL сторінки, на якій я перебуваю.
Неможливо

3
Я спробував це зробити на IE9 і: 1. Якщо у вашому шляху проекту є пробіли: замість $(TargetDir)$(TargetFileName)використання "$(TargetDir)$(TargetFileName)" 2. Якщо ви використовуєте Visual Studio 2010 Express, ви, мабуть, не бачите опцію " Запустити зовнішню програму " на вкладці "Налагодження" - я просто запустіть IE та перейдіть до вказаної URL-адреси 3. Здається, що IE9 не працює - я можу відкрити форму (параметри підкреслювача), але я не знаю, як змусити її виділити текст
pinus.acer

8
Для посилання Interop.SHDocVw - замість цього слід додати COM-посилання на "Microsoft Internets Controls", а потім "за допомогою SHDocVw;"
Ерік Хартфорд

8
"IE10 на x64 Windows 8 не завантажуватиме ваш додаток при запуску, якщо ви не будете створювати архітектуру" Будь-який процесор "та реєструватися, використовуючи 32 та 64-бітний RegAsm.exe." була редакція, яку хтось відхилив.
Мацеманн

3
Будь ласка , дивіться стежити за: stackoverflow.com/questions/22953571 / ...

12

Ще один класний підхід - перевірити:

http://www.crossrider.org

Це основа на JS з jquery, яка дозволяє розробляти розширення для браузерів для IE, FF та Chrome, використовуючи єдиний загальний код JS. В основному рамки справляють всю неприємну роботу, і вам залишається писати код вашої програми.


Так, це дійсно шлях, а також уникати кошмару, який розробляє плагін у візуальній студії, це означає, що вам потрібно лише один раз написати свій плагін для всіх браузерів. Це також означає, що не потрібно розвиватися у віртуальній машині, якщо ти користувач Mac.
opsb

11

Стан розширень IE насправді дуже сумний. У вас є стара модель браузера Helper Object IE5 (так, ті сумнозвісні BHO, які всі любили блокувати ще за день), панелі інструментів та нові прискорювачі для IE. Навіть тоді сумісність порушиться іноді. Раніше я підтримував розширення для IE6, яке зламалося з IE7, тому деякі речі змінилися. Здебільшого, наскільки я знаю (я не торкаюся BHO протягом багатьох років), вам все одно потрібно кодувати їх за допомогою Бібліотеки активних шаблонів (на зразок STL для COM-коду Microsoft), а так само для C ++. Ви можете зробити COM Interop з 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 досить застарілі. Все ж сподіваюся, що це допомагає.

EDIT: Я думаю, я можу сюди перекинути одне останнє джерело інформації. Я переглядав свої записки назад, коли я працював над організаціями, що займаються підтримкою бізнесу. І це стаття, яка мене розпочала з них. Це щось старе, але добре пояснює інтерфейси ATL, які ви будете використовувати під час роботи з IE BHO (наприклад, IObjectWithSite). Я думаю, що це досить добре пояснено і мені тоді дуже допомогло. http://msdn.microsoft.com/en-us/library/bb250436.aspx Я також перевірив приклад, який розмістив GregC. Він працює з принаймні IE8, і він сумісний з VS 2010, тому, якщо ви хочете зробити C #, ви можете почати там і подивитися на Книгу Джона Скіта. (C # у глибині 2-го видання) У главі 13 є багато інформації про нові функції C # 4, які можна використовувати для того, щоб зробити взаємодію з COM приємнішою. (Я все-таки рекомендую вам робити свій додаток на C ++)


6

Розробка C # BHO - це біль у дупі. Він включає в себе багато прискіпливого коду COM та p / call викликів.

У мене в основному закінчили C # BHO тут , які ви можете використовувати джерело для все , що ви хочете. Я кажу "здебільшого" , тому що я ніколи не розбирався, як зберегти додаток у захищеному режимі IE .


4
C # 4.0 може бути кращим у цьому плані, оскільки COM Interop значно покращився.
Роберт Харві

@Robert: Дійсно? Я не мав уявлення ... які відмінності?
користувач541686

@Mehrdad: Ви можете скуштувати відмінності тут: devx.com/dotnet/Article/42590/1954 . Для більш поглибленої дискусії дивіться розмову Андерса Хейльсберга "Майбутнє C #" тут: channel9.msdn.com/Blogs/pdc2008/TL16
Роберт Харві

1
@Robert @Mehrdad: Не дуже. Це не інтероп COM, який є хитрим (в цьому відношенні) , він розробляє та реєструє COM-модуль, у чому нові функції C # 4.0 не допомагають.
BlueRaja - Danny Pflughoeft

4

Я працюю з контролем веб-браузера IE вже багато років, і в ході них з'являється одне ім’я знов і знову з корисними повідомленнями: Ігор Тандетник

Якби я розробляв розширення, я би націлив на BHO і почав гуглювати для:

БГО Ігор Тандетник

АБО

Об’єкт помічника браузера Ігор Тандетник

Його публікації часто дуже детальні, і він знає, про що йде мова.

Ви збираєтеся опинитися на вухах у програмах COM та ATL. Ознайомтесь із прикладом детального ознайомлення: http://msdn.microsoft.com/en-us/library/ms976373.aspx


Найбільшим недоліком використання C # (який є напрямком, що йде більшість інших плакатів) є те, що він буде проходити через всілякі зайві шари, з вирішенням проблем та патчів для коду, який був би власним C ++.
Лінн Кришиться

3

Я погоджуюся з Робертом Харві, C # 4.0 має покращену функцію взаємодії з COM. Ось трохи старший код C #, який у відчайдушній потребі переписувати.

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

Це спроба спростити речі, уникаючи ATL та переходу зі спартанським COM:

C ++ та COM, щоб розпочати роботу BHO



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. Він прекрасно працював для мене в Windows 7 + SP1 та IE 11 Насолоджуйтесь!


Нам подобається, що відповіді містяться в StackOverflow. Весь цей пост мені справді каже: "використовуйте об'єкти Band та .Net 2.0". Чи можете ви включити сюди якийсь зразок коду, щоб показати, як це можна зробити?
Teepeemm

0

Питання - з 2013 року, зараз це 2020 рік, але це може бути корисним для майбутніх відвідувачів.

Я спробував реалізувати відповідь @ Мігеля Анджело, на початку це не спрацювало.

Є ще деякі параметри, які ви визначаєте.

в 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)"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.