C# を使用して Internet Explorer を自動化したい。このようにして、InternetExplorer の新しいインスタンスを作成し、いくつかのイベントに登録する単純なコンソール アプリケーションを作成しました。
次のイベントは正常に動作します: OnQuit
、BeforeNavigate2
およびNewWindow2
しかし、NewWindow3
そうではありません。すべてがコンパイルされ、プログラムを開始できますが、リンクを別のウィンドウで開くと、次の例外がスローされます。Eine Ausnahme (erste Chance) des Typs "System.ArgumentException" ist in mscorlib.dll aufgetreten.
それで、私はそのイベントで何が間違っていますか?指定されたパラメータを正確に使用しましたDWebBrowserEvents2_NewWindow3EventHandler
編集:これはライブラリのバグのようですが、独自の EventHandler メソッド/コールバックを作成する可能性はありますか? 私はいくつかの調査を行い、このページを見つけました: IE9 で MSHTML の addEventListener を使用してイベント リスナーを追加するにはどうすればよいですか? 誰かがコールバック メソッドを使用して COM クラスを作成する場所。
=> NewWindow3EventHanlder にアクセスできるように InternetExplorer クラスを拡張するにはどうすればよいですか?
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);
}
}
}