Vb.net 将WebBrowser控件绘制为位图

Vb.net 将WebBrowser控件绘制为位图,vb.net,winforms,bitmap,webbrowser-control,drawtobitmap,Vb.net,Winforms,Bitmap,Webbrowser Control,Drawtobitmap,我正在尝试使用以下代码(VB.net)将面板控件保存为位图: 除了停靠在面板中的Web浏览器控件外,所有功能都正常工作。在保存的位图中,此控件仅显示为空白,而面板中的所有其他内容都会很好地渲染。有什么想法吗?从, 使用CaptureDeskTopRectangle,但不应使用面板的位置,因为它是 参考面板父级,您应该使用yourpanel.PointToScreen()来识别正确的 长方形 问候 更新: Public Class JSsetTimeout Public res As O

我正在尝试使用以下代码(VB.net)将面板控件保存为位图:

除了停靠在面板中的Web浏览器控件外,所有功能都正常工作。在保存的位图中,此控件仅显示为空白,而面板中的所有其他内容都会很好地渲染。有什么想法吗?

从, 使用CaptureDeskTopRectangle,但不应使用面板的位置,因为它是 参考面板父级,您应该使用
yourpanel.PointToScreen()
来识别正确的 长方形 问候

更新:

Public Class JSsetTimeout

    Public res As Object = Nothing
    Dim WithEvents tm As Timer = Nothing
    Dim _MethodName As String
    Dim _args() As Object
    Dim _ClassInstacne As Object = Nothing

    Public Shared Sub SetTimeout(ByVal ClassInstacne As Object, ByVal obj As String, ByVal TimeSpan As Integer, ByVal ParamArray args() As Object)
        Dim jssto As New JSsetTimeout(ClassInstacne, obj, TimeSpan, args)
    End Sub

    Public Sub New(ByVal ClassInstacne As Object, ByVal obj As String, ByVal TimeSpan As Integer, ByVal ParamArray args() As Object)
        If obj IsNot Nothing Then
            _MethodName = obj
            _args = args
            _ClassInstacne = ClassInstacne
            tm = New Timer With {.Interval = TimeSpan, .Enabled = False}
            AddHandler tm.Tick, AddressOf tm_Tick
            tm.Start()
        End If
    End Sub

    Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tm.Tick
        tm.Stop()
        RemoveHandler tm.Tick, AddressOf tm_Tick
        If Not String.IsNullOrEmpty(_MethodName) AndAlso _ClassInstacne IsNot Nothing Then
            res = CallByName(_ClassInstacne, _MethodName, CallType.Method, _args)
        Else
            res = Nothing
        End If
    End Sub
End Class
看看这个,你会喜欢的,我和你的案子很相似,而且很有效:

Private Sub btnBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowse.Click
        Try
            Using fl As New SaveFileDialog
                fl.Filter = "PNG images|*.png"
                If fl.ShowDialog = Windows.Forms.DialogResult.OK Then
                    Dim sc As New screencapture
                    Dim pt = WebBrowser1.Parent.PointToScreen(WebBrowser1.Location)
                    Dim rec As New Rectangle(pt.X, pt.Y, WebBrowser1.Width, WebBrowser1.Height)
                    Application.DoEvents()
                    Threading.Thread.Sleep(500)
                    Using bmp As Bitmap = sc.CaptureDeskTopRectangle(rec, WebBrowser1.Width, WebBrowser1.Height)
                        bmp.Save(fl.FileName, System.Drawing.Imaging.ImageFormat.Png)
                    End Using
                End If
            End Using
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
更新2:

Public Class JSsetTimeout

    Public res As Object = Nothing
    Dim WithEvents tm As Timer = Nothing
    Dim _MethodName As String
    Dim _args() As Object
    Dim _ClassInstacne As Object = Nothing

    Public Shared Sub SetTimeout(ByVal ClassInstacne As Object, ByVal obj As String, ByVal TimeSpan As Integer, ByVal ParamArray args() As Object)
        Dim jssto As New JSsetTimeout(ClassInstacne, obj, TimeSpan, args)
    End Sub

    Public Sub New(ByVal ClassInstacne As Object, ByVal obj As String, ByVal TimeSpan As Integer, ByVal ParamArray args() As Object)
        If obj IsNot Nothing Then
            _MethodName = obj
            _args = args
            _ClassInstacne = ClassInstacne
            tm = New Timer With {.Interval = TimeSpan, .Enabled = False}
            AddHandler tm.Tick, AddressOf tm_Tick
            tm.Start()
        End If
    End Sub

    Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tm.Tick
        tm.Stop()
        RemoveHandler tm.Tick, AddressOf tm_Tick
        If Not String.IsNullOrEmpty(_MethodName) AndAlso _ClassInstacne IsNot Nothing Then
            res = CallByName(_ClassInstacne, _MethodName, CallType.Method, _args)
        Else
            res = Nothing
        End If
    End Sub
End Class
形式:

Private Sub btnBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowse.Click
        Try
            Using fl As New SaveFileDialog
                fl.Filter = "PNG images|*.png"
                If fl.ShowDialog = Windows.Forms.DialogResult.OK Then
                    JSsetTimeout.SetTimeout(Me, "TakeShot", 1500, fl.FileName)
                End If
            End Using
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
End Sub

Sub TakeShot(ByVal FilePath As String)
        Try
            Application.DoEvents()
            Dim sc As New screencapture
            Dim pt = WebBrowser1.Parent.PointToScreen(WebBrowser1.Location)
            Dim rec As New Rectangle(pt.X, pt.Y, WebBrowser1.Width, WebBrowser1.Height)
            Using bmp As Bitmap = sc.CaptureDeskTopRectangle(rec, WebBrowser1.Width, WebBrowser1.Height)
                bmp.Save(FilePath, System.Drawing.Imaging.ImageFormat.Png)
            End Using
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
End Sub
要创建延时,请添加以下类:

Public Class JSsetTimeout

    Public res As Object = Nothing
    Dim WithEvents tm As Timer = Nothing
    Dim _MethodName As String
    Dim _args() As Object
    Dim _ClassInstacne As Object = Nothing

    Public Shared Sub SetTimeout(ByVal ClassInstacne As Object, ByVal obj As String, ByVal TimeSpan As Integer, ByVal ParamArray args() As Object)
        Dim jssto As New JSsetTimeout(ClassInstacne, obj, TimeSpan, args)
    End Sub

    Public Sub New(ByVal ClassInstacne As Object, ByVal obj As String, ByVal TimeSpan As Integer, ByVal ParamArray args() As Object)
        If obj IsNot Nothing Then
            _MethodName = obj
            _args = args
            _ClassInstacne = ClassInstacne
            tm = New Timer With {.Interval = TimeSpan, .Enabled = False}
            AddHandler tm.Tick, AddressOf tm_Tick
            tm.Start()
        End If
    End Sub

    Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tm.Tick
        tm.Stop()
        RemoveHandler tm.Tick, AddressOf tm_Tick
        If Not String.IsNullOrEmpty(_MethodName) AndAlso _ClassInstacne IsNot Nothing Then
            res = CallByName(_ClassInstacne, _MethodName, CallType.Method, _args)
        Else
            res = Nothing
        End If
    End Sub
End Class

当我从
WebBrowser
保存快照时,我在导航后调用了
.Focus()
,不知怎的,白色图片神奇地消失了。不知道为什么,但对我来说很有效

问题的可能重复之处在于
WebBrowser
控件是一个ActiveX控件,根据的“备注”部分,它不支持
DrawToBitmap
方法。使用iHTMLelementTrender:我可以使用WebBrowser.DrawToBitmap(CardImg,WebBrowser.ClientRectangle)将WebBrowser控件绘制到位图。但是,这会导致在位图的角上绘制浏览器的图像。如何设置在目标图像中绘制控件的位置?此外,使用您使用的方法也没有多大意义。再澄清一下就好了。另外,捕获屏幕还需要捕获仍在面板上方的“另存为”对话框。这似乎是可行的,屏幕捕获类也需要进行一些测试。问题在于,这些捕获方法捕获程序顶部的SaveFileDialog对话框。有没有办法延迟代码的执行直到对话框关闭?我尝试了System.Threading.Sleep,但这不起作用。这很奇怪,因为它与我的电脑一起工作可能更快,无论如何,我开发了一个特殊类来创建延迟,所以请检查更新2并将我的答案标记为正确