【问题标题】:Web browser control, modal window/popup to STAY INSIDE web browser control for Visual Studio 2015/Visual Basic 2015Web 浏览器控件,用于 Visual Studio 2015/Visual Basic 2015 的 STAY INSIDE Web 浏览器控件的模式窗口/弹出窗口
【发布时间】:2016-06-06 20:22:57
【问题描述】:

这是我第一次在这里发布问题;我在这里和其他地方搜索和搜索,但似乎无法得到任何结果。我在 Visual Studio 2015 中使用 VISUAL BASIC 2015。问题:我需要在我的表单 (WebBrowser1) 的 Web 浏览器控件/窗口中保留来自特定网站的模式窗口/弹出窗口;单击特定链接时,模式窗口/弹出窗口会跳出表单并直接在其屏幕上显示给用户。我必须将此弹出窗口保留在内部,因为在该弹出窗口上要单击其他链接,但是如果它跳出 Web 浏览器控件,则由于位于 WebBrowser1 之外,因此没有代码可以工作。我发现的是旧版本的代码,而不是 2015;如果可能的话,我什至可以添加 WebBrowser2 以使弹出窗口/模态窗口出现在那里,只要我可以对它们进行编码以继续在表单内单击即可。请帮忙!谢谢你!

【问题讨论】:

  • 有人可能会回答这个问题,但它非常广泛。查看本指南以提出好的问题:stackoverflow.com/help/how-to-ask
  • 我阅读了您的回复,但似乎是针对 C# 的;我在 Visual Studio 2015 中使用 Visual Basic 2015/VB.net 进行编码。我没有 C# 经验。
  • 所以使用在线转换器...
  • 还是不行。

标签: vb.net visual-studio-2015 webbrowser-control


【解决方案1】:

window.open(以及点击<a target="_blank"> 等)可以通过NewWindow2 事件进行处理。 Hans 已经指出如何在 cmets 中做到这一点。 NewWindow3 也可以,但至少需要 Windows XP SP2。

至于window.showModalDialog,有点棘手。 IE 在scripting objects 上实现了IDispatchEx(在.Net 中包装为IExpando),因此您可以用自己的实现替换方法和属性。但是 window.showModalDialog 显示了一个具有参数和返回值的对话框,您也需要在您创建的模态对话框中覆盖这些属性。代码大致如下:

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    //skip events from frames
    if(WebBrowserReadyState.Complete!=webBrowser1.ReadyState) return;
    if(FindLoginFormOnPage()) {DoLogin();return;}
    if(IsWelcomePage()){NavigateToPage1();return;}
    if(IsPage1()){SubmitFormOnPage1();return;}
    if(IsPage1FormResult()){
        var document=webBrowser1.Document.DomDocument as mshtml.ITMLDocument2;
        var expando =(IExpando)document.parentWindow;
        expando.RemoveMember(expando.GetMethod("showModalDialog"
            ,BindingFlags.Instance | BindingFlags.Public);
        expando.AddMethod("showModalDialog"
            ,new ShowModalDialogDelegate(this.MyShowModalDialog));
    }
    ......
}

object MyShowModalDialog(string url, object varArgIn, object options)
{
    using(FromMyShowModalDialog myShowModalDialog
        =new MyShowModalDialog())
    {
        myShowModalDialog.StartupUrl=url;
        myShowModalDialog.DialogArguments=varArgIn;
        //omit the code to parse options 
        //and set dialog height/width/topleft location etc
        if(myShowModalDialog.ShowDialog()==DialogResult.OK)
        {
            //do something on the return value before passing to the scripts
            ......
            return myShowModalDialog.ReturnValue;
        }
        return null;
    }
}

在 MyShowModalDialog 的 Load 事件处理程序中,您调用类似 webBrowser1.Navigate 的内容来显示父页面请求的页面。

现在您需要将参数传递给新表单上的 webbrowser 控件。执行与上述相同的操作,但这次替换另一个属性。

expando.RemoveProperty("dialogArguments");
expando.AddProperty("dialogArguments")
    .SetValue(expando,this.DialogArguments);

这将使网页访问从 MyShowModalDialog 传递并存储在 this.DialogArguments 中的值。

最早可以访问 DOM 的是 webBrowser1_DocumentCompleted。到那时,页面上读取 window.dialogArguments 的 scipts 可能已经执行并且什么也没有得到。覆盖 window.dialogArguments 后,您需要研究页面上的脚本以了解如何恢复该脚本。例如,如果页面有

<head>
  <script>
    var oMyObject = window.dialogArguments;
    var sFirstName = oMyObject.firstName;
    var sLastName = oMyObject.lastName;
  </script>
...

<span style="color: 00ff7f">
    <script>
      document.write(sFirstName);
    </script>
  </span>

您需要更改 sFirstName 和 sLastName 的值,然后更改 span 的 innerText 属性,可能通过其与命名 div 或表格单元格的关系来识别。您可以在脚本中编写必要的更改并通过 HtmlDocument.InvokeScript 调用它。

如果页面向其父级返回一个值,您也需要将其传递给您的父级表单。覆盖 window.returnValue 以便当脚本写入 window.returnValue 时,它​​会写入您提供的变量

 ......
expando.RemoveProperty("returnValue");
expando.AddProperty("returnValue").SetValue(expando,this.ReturnValue);

【讨论】:

  • 感谢您的回答,但这仍然不能解决我的问题;如果你愿意,我可以给你发一张截图给你
  • 显然我猜错了你的问题。在任何人可以进一步帮助您之前,您需要说出您的问题是什么。只是说“它不起作用”对任何人都没有帮助,包括你自己。如果您想添加屏幕截图,请更改您的问题。
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
相关资源
最近更新 更多