Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在WebBrowser中加载的网页内设置框架窗口的On-BeforeUnload?_.net_Iframe_Webbrowser Control_Onbeforeunload_Mshtml - Fatal编程技术网

.net 如何在WebBrowser中加载的网页内设置框架窗口的On-BeforeUnload?

.net 如何在WebBrowser中加载的网页内设置框架窗口的On-BeforeUnload?,.net,iframe,webbrowser-control,onbeforeunload,mshtml,.net,Iframe,Webbrowser Control,Onbeforeunload,Mshtml,在WebBrowser组件中加载的网页的iFrame中加载的某些网页在关闭网页时会弹出一个确认窗口。此确认窗口阻止主网页关闭,因此我必须单击该选项以离开该页面。我希望通过更改加载在iFrame中的网页的onbeforeuload事件来避免这种情况 我已尝试修改并将其应用于我的案例。但是,该解决方案似乎仅适用于访问WebBrowser内部加载的页面事件,而不是其内部的iFrame事件 这就是我尝试过的 我首先声明了上述解决方案中的接口: [ComImport] [InterfaceType(Com

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

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

请随时要求进一步解释。提前谢谢

编辑: 应用程序的进一步说明。


应用程序按顺序导航到网页列表。处理完每个页面后,需要将其关闭,然后加载下一个页面。每个网页都有一个iframe,它依次从不同的域加载网页。我对应用程序没有任何问题,除非在iframe中加载的网页在其
onbeforeuload
事件中调用
confirm
popup
。确认弹出框阻止应用程序进一步处理网页。我需要去掉这个弹出确认窗口。

如果弹出窗口出现问题,我为您提供了一个解决方案,如果您想在客户端计算机上禁用/启用javascript(或者如果启用/禁用javascript,甚至只需读取/查询),我也为您提供了答案,现在我们开始:

要禁用哪个弹出消息?如果是警报消息,请尝试此操作,很明显,将窗口或框架对象解析为您的特定需要,我只是假设为顶级文档,但如果您需要iframe,则可以使用window.frames(0)访问它。对于第一帧等等。。。(关于JavaScript部分)。。。下面是一些代码,假设WB是您的webbrowser控件

WB.Document.parentWindow.execScript "window.alert = function () { };", "JScript"
但是,在您的情况下,由于要禁用打印,只需将
.alert
替换为
.print

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

下面是一个常量字符串(用VB声明),它将删除4个弹出窗口,包括新的IE9弹出窗口。此外,它将摆脱onbeforeunload事件,并在其运行的每个页面上执行所有这些操作。如果您有框架,您也不需要在框架中运行它们,只需在父文档中运行就足够了。这里(在VB6中声明),u只是我放在那里的一个换行符,使它更易于阅读,&用于字符串连接,以及;在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控件加载到内存之前更改注册表,每次更改它(打开和关闭)时,都必须将webbrowser控件重新加载到内存中(或重新启动应用程序)

注册表项是 \HKEY\ U当前\用户\软件\ Microsoft\Windows\CurrentVersion\Internet 设置\区域\-键名为1400,禁用该键的值为 3,启用它的值为0

当然,因为zones键下有5个区域,所以您需要为活动区域或所有区域更改它。然而,如果您只想使用supersjs对话框弹出消息,那么您真的不需要这样做


让我知道你是怎么做的,如果我能进一步帮助你。

如果你在弹出弹出窗口时遇到问题,我为你提供了一个解决方案,如果你想在客户端机器上禁用/启用javascript(或者如果启用/禁用javascript,甚至只是读取/查询),我也为你提供了答案,现在我们开始:

要禁用哪个弹出消息?如果是警报消息,请尝试此操作,很明显,将窗口或框架对象解析为您的特定需要,我只是假设为顶级文档,但如果您需要iframe,则可以使用window.frames(0)访问它。对于第一帧等等。。。(关于JavaScript部分)。。。下面是一些代码,假设WB是您的webbrowser控件

WB.Document.parentWindow.execScript "window.alert = function () { };", "JScript"
但是,在您的情况下,由于要禁用打印,只需将
.alert
替换为
.print

你必须在整个页面加载完成后才运行上面的代码,我知道这很难做到(而且完整的校对版本还没有发布),但是我已经做了一段时间了(完整的校对),如果你阅读了其中的一些内容,你可以收集到关于如何准确执行此操作的提示