Webbrowser control handling [removed] popup

后端 未结 1 1432
暖寄归人
暖寄归人 2020-12-10 21:55

My software handles navigation to target=_new through this function

Private Sub Web1_NewWindow(...) Handles Web1.NewWindow
    Web1.Navigate(Web1.StatusText         


        
相关标签:
1条回答
  • 2020-12-10 22:15

    Depending on what exactly is inside the javascript: link, it may or may not work. For example:

    <body>
    
    <!-- These work -->
    
    <a href="http://www.example.com" target="_blank">Test 0</a><br>
    <a href="javascript:navigate('http://www.example.com')" target="_blank">Test 1</a><br>
    <a href="javascript:'<b>hello</b> from new page!'" target="_blank">Test 2</a><br>
    <a href="javascript:''" target="_blank">Test 3</a><br>
    <a href="javascript:TestFunc()" target="_blank">Test 4</a><br>
    
    <!-- This does not work -->
    
    <a href="javascript:open('http://www.example.com')" target="_blank">Test 5</a><br>
    
    
    <script>
    function TestFunc()
    {
        return "<b>TestFunc</b> result.";
    }
    </script>
    
    </body>
    

    Here's the code that handles NewWindow event. This code is in C#, unfortunately I don't know VB.NET good enough to properly translate it.

    private void Form1_Load(object sender, EventArgs e)
    {
        // this code depends on SHDocVw.dll COM interop assembly,
        // generate SHDocVw.dll: "tlbimp.exe ieframe.dll",
        // and add as a reference to the project
    
        var activex = (SHDocVw.WebBrowser_V1)this.webBrowser.ActiveXInstance;
    
        activex.NewWindow += delegate(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
        {
            Processed = true;
            object flags = Flags;
            object targetFrame = Type.Missing;
            object postData = PostData != null ? PostData : Type.Missing;
            object headers = !String.IsNullOrEmpty(Headers)? Headers.ToString() : Type.Missing;
            activex.Navigate(URL, ref flags, ref targetFrame, ref postData, ref headers);
        };
    
        this.webBrowser.Navigate("http://localhost:81/new-window-test.html");
    }
    

    Now, if you really need to make Test 5 work, it's still possible. The problem with it is there are in fact two navigations, the second one is nested, which might be the reason for error 0x800700AA. The trick is to return from NewWindow event first, and then do the navigation:

    private void Form1_Load(object sender, EventArgs e)
    {
        // this code depends on SHDocVw.dll COM interop assembly,
        // generate SHDocVw.dll: "tlbimp.exe ieframe.dll",
        // and add as a reference to the project
    
        var activex = (SHDocVw.WebBrowser_V1)this.webBrowser.ActiveXInstance;
    
        activex.NewWindow += delegate(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
        {
            Processed = true;
            object flags = Flags;
            object targetFrame = Type.Missing;
            object postData = PostData != null ? PostData : Type.Missing;
            object headers = !String.IsNullOrEmpty(Headers) ? Headers.ToString() : Type.Missing;
            SynchronizationContext.Current.Post(delegate
            {
                activex.Navigate(URL, ref flags, ref targetFrame, ref postData, ref headers);
            }, null);
        };
    
        this.webBrowser.Navigate("http://localhost:81/new-window-test.html");
    }
    

    Tested with IE10.

    [UPDATE]

    Try this (verified):

    Public Class Form1
        Dim ActiveX As SHDocVw.WebBrowser_V1
    
        Private Sub NavigateOnNewWindow(NewWindowUrl As Object)
            Me.ActiveX.Navigate(NewWindowUrl.ToString())
        End Sub
    
        Private Sub NewWindow(URL As String,
                              Flags As Integer,
                              TargetFrameName As String,
                              ByRef PostData As Object,
                              Headers As String,
                              ByRef Processed As Boolean)
            Processed = True
            System.Threading.SynchronizationContext.Current.Post(AddressOf NavigateOnNewWindow, URL)
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' Init DocumentText, otherwise Me.WebBrowser1.ActiveXInstance is null, this is different from C#
            Me.WebBrowser1.DocumentText = String.Empty
            Me.ActiveX = Me.WebBrowser1.ActiveXInstance
            AddHandler Me.ActiveX.NewWindow, AddressOf NewWindow
            Me.WebBrowser1.Navigate("http://localhost:81/new-window-test.html")
        End Sub
    End Class
    
    0 讨论(0)
提交回复
热议问题