3

我想使用 C# 自动化 Internet Explorer。因此,我编写了简单的控制台应用程序,它创建了 InternetExplorer 的新实例,然后注册了一些事件。

以下事件工作正常OnQuitBeforeNavigate2NewWindow2

NewWindow3没有。一切都可以编译并且可以启动程序,但是当您在另一个窗口中打开链接时会引发以下异常:Eine Ausnahme (erste Chance) des Typs "System.ArgumentException" ist in mscorlib.dll aufgetreten.

那么我在那个事件中做错了什么?我已经完全使用了中指定的参数DWebBrowserEvents2_NewWindow3EventHandler

编辑:由于这似乎是库中的一个错误,是否有可能创建自己的 EventHandler 方法/回调的东西?我做了一些研究,发现了这个页面:如何在 IE9 中使用 MSHTML 的 addEventListener 添加事件监听器? 有人使用回调方法创建 COM 类。

=> 如何扩展 InternetExplorer 类以便可以访问 NewWindow3EventHanlder?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using SHDocVw;
using MSHTML;
using Microsoft.VisualBasic;

namespace BrowserControl
{
    class Program
    {
        private ManualResetEvent closed;
        private InternetExplorer ie;

        public Program()
        {
            closed = new ManualResetEvent(false);
        }

        private void setupIE(InternetExplorer ie = null)
        {
            if (ie == null)
            {
                this.ie = ie = new InternetExplorer();
                Console.WriteLine(Information.TypeName(ie)+" "+Information.TypeName(ie.Application));
            }

            ie.NewWindow3 += new DWebBrowserEvents2_NewWindow3EventHandler(NewWindow3);
            ie.NewWindow2 += new DWebBrowserEvents2_NewWindow2EventHandler(NewWindow2);
            ie.BeforeNavigate2 += BeforeNavigate2;
            ie.OnQuit += OnQuit;

            ie.Visible = true;
        }

        public void NewWindow2(ref object ppDisp, ref bool Cancel)
        {
            Console.WriteLine("new window 2");
        }
        public void NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl)
        {
            Console.WriteLine("new window 3");
        }
        public void BeforeNavigate2(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)
        {
            IWebBrowser2 cie = (IWebBrowser2)pDisp;
            Console.WriteLine(cie.LocationURL + " navigates to " + URL + " target=" + TargetFrameName + " ...");
        }
        public void OnQuit()
        {
            Console.WriteLine("quit");
            closed.Set();
        }

        static void Main(string[] args)
        {
            Program p = new Program();

            Console.WriteLine("Starting Browser ...");
            p.setupIE();

            Console.WriteLine("Up And Running!");
            p.closed.WaitOne();

            Console.WriteLine("Shutting down ...");
            System.Threading.Thread.Sleep(2000);
        }

    }
}
4

0 回答 0