打印其中包含的 Web 浏览器控件后关闭表单

Closing form after printing a web browser control contained in it

我正在通过 html 和 vb.net winforms 中的 Web 浏览器控件进行一些随机打印 这是我的代码

Public Class Form1

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim myWebBrowser As New WebBrowser
    AddHandler myWebBrowser.DocumentCompleted, AddressOf DocumentCompleted
    myWebBrowser.Navigate("http://www.bing.com")

  End Sub

  Private Sub DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)

    With DirectCast(sender, WebBrowser)
      If .ReadyState = WebBrowserReadyState.Complete Then
        .Print()
      End If
    End With
  End Sub

End Class

我希望表格在打印后关闭。现在,如果我在 .Print() 之后写 Me.Close(),则不会打印任何内容。我应该怎么做才能实现这一目标?

感谢任何帮助。

::更新::

根据@Noseratio 的建议,我尝试在我的 html 中处理事件 onafterprint,并尝试使用 ObjectFoprScripting 设置为我的表单来调用 Me.Close()。但那是在没有任何打印的情况下触发 close 方法。

这是我的代码

script tag in my html page

<script>
    function window.onafterprint() {
        window.external.Test('called from script code');
    }
</script>

VB.net Code of my form

Imports System.IO
Imports Microsoft.Win32
Imports System.Security.Permissions

<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        WebBrowser1.AllowWebBrowserDrop = False
        WebBrowser1.IsWebBrowserContextMenuEnabled = False
        WebBrowser1.WebBrowserShortcutsEnabled = False
        webBrowser1.ObjectForScripting = Me
        WebBrowser1.DocumentText = File.ReadAllText("localprint.htm")
    End Sub

    Public Sub Test(ByVal message As String)
        MessageBox.Show(message, "client code")
        Me.BeginInvoke(DirectCast(Sub() Me.Close(), MethodInvoker))
    End Sub

    Private Sub WebBrowser1_DocumentCompleted(sender As System.Object, e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        WebBrowser1.Print()
    End Sub
End Class

找到我的解决方案

无需处理 javascript 中的 onafterprint
这是我所做的,

步骤 1
在我的项目中添加了对 SHDocVw.dll 的引用。这可以在 c:\windows\system32 文件夹中找到。

步骤 2

My new updated code

Imports System.IO
Imports Microsoft.Win32
Imports System.Security.Permissions

<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        WebBrowser1.AllowWebBrowserDrop = False
        WebBrowser1.IsWebBrowserContextMenuEnabled = False
        WebBrowser1.WebBrowserShortcutsEnabled = False
        WebBrowser1.DocumentText = File.ReadAllText("localprint.htm")
    End Sub

    Private Sub WebBrowser1_DocumentCompleted_1(sender As System.Object, e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Dim wb As WebBrowser = TryCast(sender, WebBrowser)

        Dim ie As SHDocVw.InternetExplorer = DirectCast(wb.ActiveXInstance, SHDocVw.InternetExplorer)
        AddHandler ie.PrintTemplateInstantiation, AddressOf IE_OnPrintTemplateInstantiation
        AddHandler ie.PrintTemplateTeardown, AddressOf IE_OnPrintTemplateTeardown

        'Just to get reference of  the webBrowser1 control in ie events, uncomment the below line
        'ie.PutProperty("WebBrowserControl", DirectCast(wb, Object))

        wb.Print()
    End Sub

    Private Sub IE_OnPrintTemplateInstantiation(pDisp As Object)
        ' The PrintTemplateInstantiation event is fired when the print job is starting.
    End Sub

    Private Sub IE_OnPrintTemplateTeardown(pDisp As Object)
        ' The PrintTemplateTeardown event is fired when the print job is done.

        'Just to get reference of  the webBrowser1 control, uncomment the below line
        'Dim iwb2 As SHDocVw.IWebBrowser2 = TryCast(pDisp, SHDocVw.IWebBrowser2)
        'Dim wb As WebBrowser = DirectCast(iwb2.GetProperty("WebBrowserControl"), WebBrowser)

        Me.Close()

    End Sub
End Class