コンポーネントにロードされた Web ページの iFrame 内にロードされた一部の Web ページには、Web ページをWebBrowser
閉じるときに確認ウィンドウがポップアップ表示されます。この確認ウィンドウが原因で、メインの Web ページを閉じることができないため、ページを離れるオプションをクリックする必要があります。onbeforeunload
iFrame 内に読み込まれる Web ページのイベントを変更することで、これを回避したいと考えています。
このソリューションを変更して、自分のケースに適用しようとしました。ただし、ソリューションは、その中WebBrowser
の iFrame ではなく、その中にロードされたページのイベントにアクセスする場合にのみ適用されるようです。
だからここに私が試したことがあります。
上記のソリューションから最初にインターフェイスを宣言しました。
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("00020400-0000-0000-C000-000000000046")]
public interface IDispatch
{
[PreserveSig]
int GetTypeInfoCount(out int Count);
[PreserveSig]
int GetTypeInfo(
[MarshalAs(UnmanagedType.U4)] int iTInfo,
[MarshalAs(UnmanagedType.U4)] int lcid,
out ITypeInfo typeInfo
);
[PreserveSig]
int GetIDsOfNames(
ref Guid riid,
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] rgsNames,
int cNames,
int lcid,
[MarshalAs(UnmanagedType.LPArray)] int[] rgDispId
);
[PreserveSig]
int Invoke(
int dispIdMember,
ref Guid riid,
uint lcid,
ushort wFlags,
ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams,
out object pVarResult,
ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo,
IntPtr[] pArgErr
);
}
次に、ポップアップがポップアップしないように、onbeforeunload
イベントを設定するか、何らかの方法でその内容を消去したいと思います。null
HTMLDocument document = (HTMLDocument)webBrowser2.Document.DomDocument;
// iFrame's id is "iF".
HTMLFrameElement frame = (HTMLFrameElement)document.getElementById("iF");
IHTMLWindow2 window = frame.contentWindow;
// Everything works fine until the following line.
var event = (ExtendedWebBrowser.IDispatch)window.onbeforeunload;
// Although no exception is thrown, event variable is always null, no matter if the webpage in the iFrame has or does not have onbeforeunload event specified.
// Setting the event to null does nothing. I'd have to come up with how to read this event before trying to set it to something.
window.onbeforeunload = null;
私の最後の質問は、WebBrowser コントロールにロードされた Web ページの iFrame 内にロードされた Web ページの onbeforeunload イベント (またはその他のイベント) を取得および設定するにはどうすればよいですか?
ご不明な点がございましたら、お気軽にお問い合わせください。前もって感謝します。
編集:
アプリケーションルーチンの詳細説明。
アプリケーションは Web ページのリストに順次移動しています。各ページが処理されたら、ページを閉じて次のページをロードする必要があります。すべての Web ページには、別のドメインから Web ページをロードする iframe があります。confirm
iframe 呼び出し内またはpopup
そのonbeforeunload
イベント内にロードされた Web ページの場合を除いて、アプリケーションにまったく問題はありません。確認ポップアップ ボックスが原因で、アプリケーションがそれ以上 Web ページを処理できなくなります。このポップアップ確認ウィンドウを取り除く必要があります。