gpt4 book ai didi

c# - window.close (javascript) 关闭窗口时如何通知我?

转载 作者:行者123 更新时间:2023-11-29 18:30:23 28 4
gpt4 key购买 nike

我被要求改造一个围绕 IE 9 控件构建的自定义 Web 浏览器。其中一项要求是必须捕获所有弹出窗口并将其重定向到新选项卡。客户不希望出现任何 float 的独立窗口。

之前的开发人员实现了以下功能来捕获这些案例并打开一个新选项卡。

public void NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl)
{
BrowserExtendedNavigatingEventArgs args = new BrowserExtendedNavigatingEventArgs(ppDisp, new Uri(bstrUrl), null, (UrlContext)dwFlags);
_Browser.OnStartNewWindow(args);
Cancel = args.Cancel;
ppDisp = args.AutomationObject;
}

当其中一个打开的窗口希望能够从 javascript 调用 window.close 时,就会出现问题。

我希望我可以使用这个功能

public void WindowClosing(bool isChildWindow, ref bool cancel)

检测 javascript 调用并关闭选项卡。但是这个函数永远不会被调用。 javascript 函数本身似乎有效。选项卡的内容被清除。我如何检测到这种情况并关闭选项卡?

请注意,IE9 active x 控件不是硬性要求。但是请不要建议我仅仅为了互联网的纯度而切换渲染引擎:P。

编辑:

这是我在 C# 中对 DWebBrowserEvents2 接口(interface)的定义。

    [ComImport, TypeLibType((short)0x1010), InterfaceType((short)2), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D")]
public interface DWebBrowserEvents2
{
[DispId(0x111)]
void NewWindow3(
[In, Out, MarshalAs(UnmanagedType.IDispatch)] ref object ppDisp,
[In, Out] ref bool Cancel,
[In] uint dwFlags,
[In, MarshalAs(UnmanagedType.BStr)] string bstrUrlContext,
[In, MarshalAs(UnmanagedType.BStr)] string bstrUrl);

[DispId(253)]
void OnQuit();

[DispId(263)]
void WindowClosing(
[In] bool isChildWindow,
[In, Out] ref bool cancel);

[DispId(283)]
void WindowStateChanged(
[In] uint dwFlags,
[In] uint dwVAlidFlagsMask);

[DispId(271)]
void NavigateError(
[In, MarshalAs(UnmanagedType.IDispatch)] object pDisp,
[In] ref object URL, [In] ref object frame,
[In] ref object statusCode, [In, Out] ref bool cancel);
}

最佳答案

在这里找到答案:http://social.msdn.microsoft.com/Forums/en/winforms/thread/1cda7799-bf65-4c66-a3bf-488656998191它对我有用。

万一链接消失了,这里是那个页面的答案:

// A delegate type for hooking up close notifications.
public delegate void ClosingEventHandler(object sender, EventArgs e);

// We need to extend the basic Web Browser because when a web page calls
// "window.close()" the containing window isn't closed.
public class ExtendedWebBrowser : WebBrowser
{
// Define constants from winuser.h
private const int WM_PARENTNOTIFY = 0x210;
private const int WM_DESTROY = 2;

public event ClosingEventHandler Closing;

protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_PARENTNOTIFY:
if (!DesignMode)
{
if (m.WParam.ToInt32() == WM_DESTROY)
{
Closing(this, EventArgs.Empty);
}
}
DefWndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
}

//Then your containing class has the following:
private ExtendedWebBrowser browserControl;
this.browserControl.Closing +=new ClosingEventHandler(browserControl_Closing);
private void browserControl_Closing(object sender, EventArgs e)
{
this.Close();
}

关于c# - window.close (javascript) 关闭窗口时如何通知我?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9101113/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com