如何在WebBrowser中加载的网页内设置框架窗口的onbeforeunload?

时间:2012-08-29 20:52:45

标签: .net iframe webbrowser-control onbeforeunload mshtml

WebBrowser组件中加载的网页的iFrame中加载的某些网页在关闭网页时会弹出一个确认窗口。此确认窗口阻止主网页关闭,因此我必须单击选项离开页面。我想通过更改iFrame中加载的网页的onbeforeunload事件来避免这种情况。

我尝试修改this solution并将其应用于我的案例。但是,似乎该解决方案仅在访问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控件中加载的网页的iFrame中加载的网页的onbeforeunload事件(或任何其他事件)?

随意请求任何进一步的解释。提前谢谢。

编辑:

应用程序例程的进一步说明。

应用程序按顺序导航到网页列表。处理完每个页面后,需要关闭它,然后加载下一个页面。每个网页都有一个iframe,后者又从不同的域加载网页。我对该应用程序没有任何问题,除非iframe中加载的网页在其confirm事件中调用popuponbeforeunload。确认弹出框阻止应用程序处理更多网页。我需要摆脱这个弹出确认窗口。

1 个答案:

答案 0 :(得分:1)

如果您遇到弹出式弹出窗口的问题,我已经为您提供了一个解决方案,如果您想在客户端计算机上禁用/启用javascript(甚至只是在启用/禁用时读取/查询)ive包括你的答案,我们走了:

您要禁用哪条弹出式消息?如果它是警告消息,请尝试这一点,显然根据您的特定需求解析窗口或框架对象,我只假设顶级文档,但如果您需要iframe,则可以使用window.frames(0)访问它。对于第一帧等等...(重新编写JavaScript部分)...这里有一些代码,假设WB是你的webbrowser控件......

WB.Document.parentWindow.execScript "window.alert = function () { };", "JScript"

但是,在您的情况下,由于您要禁用打印,只需将.alert换成.print

只有在整个页面加载完毕后才能运行上面的代码,我知道这很难做到(并且还没有发布完整的版本)但是我一直这样做(完全证明)现在已经有一段时间了,如果您阅读我以前的一些标记为“webbrowser”和“webbrowser-control”的答案,您可以收集有关如何准确执行此操作的提示,但如果您想要取消,请回到手头的问题.confirm JavaScript消息,只需用window.confirm替换window.alert(当然,使用正确的对象限定窗口。对象以到达您正在使用的文档层次结构)。您也可以使用上述技术和新的IE9 .prompt方法禁用.print方法。

这是一个常量字符串(在VB中声明),它将摆脱4个弹出窗口,包括新的IE9弹出窗口。此外,它将摆脱onbeforeunload事件,它将在其运行的每个页面上执行所有这些操作。如果你有框架,你也不需要在框架中运行它们,只需在父文档中运行就足够了。在这里(在VB6中声明),_只是为了延伸而我放在那里以便于阅读,&用于字符串连接,并且;在javascript中只是意味着将下面的内容视为另一行代码。这样,您可以在一个物理行中运行多行代码(下面,我认为5)。

Public Const DEFAULT_JS_TO_RUN_AFTER_EACH_PAGE_LOAD As String = _
& "window.alert = function () { }; window.confirm = function () { }; " _
& "window.prompt = function () { }; window.print = function () { }; " _
& "window.onbeforeunload = function () { };"

如果要完全禁用JavaScript,可以使用注册表执行此操作,并且必须在webbrowser控件加载到内存之前更改注册表,并且每次更改它(on& off)时必须重新加载webbrowser控制进入内存(或只是重启你的应用程序)。

  

注册表项是   \ HKEY_CURRENT_USER \ SOFTWARE \微软\的Windows \ CurrentVersion \互联网   Settings \ Zones \ - 键名为1400,禁用它的值为   3,并使其为0。

当然,因为Zones键下有5个区域,您需要为活动区域或所有区域更改它以确保。但是,如果你想要做的只是supress js对话框弹出消息,你真的不需要这样做。

请告诉我你的进展情况,以及我是否可以继续提供帮助。