Internet Explorer를 자체 제작 애드온으로 확장(.NET Framework 사용)

소개



인터넷 익스플로러(인터넷 익스플로러)는 오와콘이라고 생각했는데, 지원 종료는 미정.
RPA도 성황으로 자동 조작을 여러가지 할 수 있으면 편리하다고 생각하므로, 확장 방법을 간단히 정리해 보았습니다.

절차



Visual Studio 2019에서 만드는 예제입니다.

프로젝트 만들기



프로젝트 템플릿을 사용하여 생성



프로젝트 템플릿으로 클래스 라이브러리(.NET Framework)를 선택하여 만듭니다. 솔루션 이름, 프레임워크 등은 선택 사항입니다.

1

프로젝트 속성에서 COM 게시 설정



프로젝트 속성 "응용 프로그램"에서 "어셈블리 정보"버튼을 클릭하고 "어셈블리를 COM 참조 가능하게 만들기"를 선택하고 확인 버튼으로 저장합니다.

참조 설정



솔루션 탐색기에서 찾아보기를 마우스 오른쪽 단추로 클릭하고 참조 추가를 선택하고 COM에서 다음 두 가지를 추가합니다. 이 외에, 메세지 박스 표시를 위한 System.Windows.Forms 어셈블리등도 필요에 따라서 추가합니다.
  • Microsoft HTML Object (DOM을 조작하지 않으면 불필요)
  • Microsoft Internet Controls

  • 코딩



    인터페이스를 COM 게시합니다.

    솔루션 탐색기에서 솔루션에 인터페이스를 추가하고 파일 이름을 IObjectWithSite.cs로 지정합니다.

    IObjectWithSite.cs
    using System;
    using System.Runtime.InteropServices;
    
    namespace SampleIEAddOn
    {
        [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, out IntPtr ppvSite);
        }
    }
    

    그런 다음 솔루션 탐색기에서 자동으로 생성된 Class1.cs의 이름을 IEAddOn.cs로 바꿉니다.
    「툴」 「GUID 의 작성」으로부터 독자적으로 GUID 를 생성해 (서식은 5번), IObjectWithSite 인터페이스의 구현을 겸해 다음과 같이 코딩합니다.

    IEAddOn.cs
    
    using System;
    using System.Linq;
    using System.Runtime.InteropServices;
    using mshtml;
    using SHDocVw;
    using Microsoft.Win32;
    
    namespace SampleIEAddOn
    {
        [ComVisible(true),
         ClassInterface(ClassInterfaceType.None),
         Guid("????????-????-????-????-????????????")] // <- 生成したGUID
        public class IEAddOn : IObjectWithSite
        {
            #region COMBHOの登録と解除 - regasm ツールで呼ばれます。
            private const string BHOKEYNAME = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects";
    
            [ComRegisterFunction]
            public static void RegisterBHO(Type type)
            {
                RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHOKEYNAME, true);
    
                if (registryKey == null)
                    registryKey = Registry.LocalMachine.CreateSubKey(BHOKEYNAME);
    
                string guid = type.GUID.ToString("B");
                RegistryKey ourKey = registryKey.OpenSubKey(guid);
    
                if (ourKey == null)
                    ourKey = registryKey.CreateSubKey(guid);
    
                ourKey.SetValue("Alright", 1);
                registryKey.Close();
                ourKey.Close();
            }
    
            [ComUnregisterFunction]
            public static void UnregisterBHO(Type type)
            {
                RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHOKEYNAME, true);
                string guid = type.GUID.ToString("B");
    
                if (registryKey != null)
                    registryKey.DeleteSubKey(guid, false);
            }
            #endregion
    
    
            private WebBrowser webBrowser;
    
            public int GetSite(ref Guid guid, out IntPtr ppvSite)
            {
                IntPtr punk = Marshal.GetIUnknownForObject(webBrowser);
                int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
                Marshal.Release(punk);
    
                return hr;
            }
    
            public int SetSite([MarshalAs(UnmanagedType.IUnknown)] object site)
            {
                if (site != null)
                {
                    webBrowser = site as WebBrowser;
                    webBrowser.DocumentComplete += WebBrowser_DocumentComplete; // DocumentCompleteイベントを利用する例
                    webBrowser.BeforeNavigate2 += WebBrowser_BeforeNavigate2; // BeforeNavigate2イベントを利用する例
                }
                else
                {
                    webBrowser.DocumentComplete -= WebBrowser_DocumentComplete;
                    webBrowser.BeforeNavigate2 -= WebBrowser_BeforeNavigate2;
                    webBrowser = null;
                }
    
                return 0;
            }
    
            private void WebBrowser_BeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)
            {
                System.Windows.Forms.MessageBox.Show("ナビゲート開始"); // 参照に System.Windows.Forms アセンブリを追加
            }
    
            private void WebBrowser_DocumentComplete(object pDisp, ref object URL)
            {
                var document = (HTMLDocument)webBrowser.Document;
                var titleText = document.getElementsByTagName("title")
                    .Cast<IHTMLElement>()
                    .FirstOrDefault()?.innerText ?? "空のタイトル";
                System.Windows.Forms.MessageBox.Show(titleText); // 参照に System.Windows.Forms アセンブリを追加
            }
        }
    }
    
    

    애드온으로 등록



    관리자 권한으로 regasm 도구를 사용하여 (시작 메뉴 Visual Studio 2019의 "Developer Command Prompt for VS2019"에서 유용) 레지스트리를 등록합니다. 엄밀한 이름의 사용을 추천하므로 본격 개발에서는 검토합시다.
  • 등록regasm /codebase <.dllファイルのフルパス>
  • 등록 해제regasm /unregister <.dllファイルのフルパス>

  • 시도하다



    Internet Explorer(인터넷 탐색기)를 시작해 봅니다. 처음 "알 수없는 게시자 '.....'를 사용할 수 있습니다."라고 하단에 표시되므로 "활성화"를 선택합니다.

    샘플에서는 메시지 상자가 표시됩니다. 대단히 생각하기 때문에 결과를 확인할 수 있으면 "애드온 관리"에서 비활성화하거나 제거 (unregister)하십시오.

    참고로 한 정보원(감사)



  • IObjectWithSite - Jia.Chen (CodeProject)

  • htps //w w. 여기에서 p 로지 ct. 코 m / r 치 c ぇ s / 19971/ - EternalWindows



  • h tp : // 어서 r인 l 우안도 ws. jp / b 로 w r / b 호 / b 호 00. HTML - 야마시 료노 우동 도자기 일기 @ IT.

    좋은 웹페이지 즐겨찾기