我有一个Web浏览器对象,我可以截取屏幕截图。代码可以在这里找到:http://www.vbknowledgebase.com/?Id=65&Desc=Convert-Web-Page-or-Html-to-Image(我稍微修改了一下)。
看来,如果我在本地部署应用程序,然后尝试捕获本地页面的屏幕截图,例如http://localhost/localpage,程序挂起并且不会生成屏幕截图。但是,如果我在本地部署应用程序并尝试生成外部网站的屏幕截图,例如http://www.google.co.uk,它完美无缺。
起初我虽然这是STA(单线程公寓)的问题,所以我发布了一个关于线程的问题,但现在我不太确定。请求本地页面的Web浏览器对象是否有任何问题?我在MSDN上看过,但在这里找不到任何结论。
以下是完整代码:
“ImageFromHTML.vb
Imports Microsoft.VisualBasic
Imports System.Threading
Imports System.Drawing
Imports System.Windows.Forms
Public Class ImageFromHtml
Private PageUrl As String = "http://localhost/Default2.aspx"
Private ConvertedImage As Bitmap
Private m_intHeight As Integer = 1000
Public Property Height() As Integer
Get
Return m_intHeight
End Get
Set(ByVal value As Integer)
m_intHeight = value
End Set
End Property
Private m_intWidth As Integer = 100
Public Property Width() As Integer
Get
Return m_intWidth
End Get
Set(ByVal value As Integer)
m_intWidth = value
End Set
End Property
Public Function ConvertPage() As Bitmap
Me.PageUrl = PageUrl
Dim thrCurrent As New Thread(New ThreadStart(AddressOf CreateImage))
thrCurrent.SetApartmentState(ApartmentState.STA)
thrCurrent.Start()
thrCurrent.Join()
ConvertedImage.Save("c:\Test.bmp", _
System.Drawing.Imaging.ImageFormat.Bmp)
Return ConvertedImage
End Function
Public Sub CreateImage()
Dim BrowsePage As New WebBrowser()
BrowsePage.ScrollBarsEnabled = False
BrowsePage.Navigate(PageUrl)
AddHandler BrowsePage.DocumentCompleted, AddressOf _
WebBrowser_DocumentCompleted
While BrowsePage.ReadyState <> WebBrowserReadyState.Complete
Application.DoEvents()
End While
BrowsePage.Dispose()
End Sub
Private Sub WebBrowser_DocumentCompleted(ByVal sender As Object, ByVal e As _
WebBrowserDocumentCompletedEventArgs)
Dim BrowsePage As WebBrowser = DirectCast(sender, WebBrowser)
BrowsePage.ClientSize = New Size(Width, Height)
BrowsePage.ScrollBarsEnabled = False
ConvertedImage = New Bitmap(Width, Height)
BrowsePage.BringToFront()
BrowsePage.DrawToBitmap(ConvertedImage, BrowsePage.Bounds)
End Sub
End Class
“Default.aspx.vb
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim obj As New ImageFromHtml()
obj.ConvertPage()
obj = Nothing
End Sub
如果我将PageURL变量更改为外部网站,例如http://www.google.co.uk,它有效。它不像上面那样有用。
答案 0 :(得分:0)
此处的Web控件不会崩溃,只是抛出您未使用try-catch架构捕获的错误消息。
此函数使用WebBrowser 类来读取页面并使其成为位图。
所以出于任何原因,可能是错误的端口,没有找到服务器,服务器没有返回等等,你得到一个错误,你没有处理这个错误抛出。抛出是在导航时发生的,这是来自MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.navigated.aspx
的示例' Navigates to the given URL if it is valid.
Private Sub Navigate(ByVal address As String)
If String.IsNullOrEmpty(address) Then Return
If address.Equals("about:blank") Then Return
If Not address.StartsWith("http://") And _
Not address.StartsWith("https://") Then
address = "http://" & address
End If
Try
webBrowser1.Navigate(New Uri(address))
Catch ex As System.UriFormatException
Return
End Try
End Sub
但您可以使用之前的try catch。
关注代码的这一部分
While BrowsePage.ReadyState <> WebBrowserReadyState.Complete
Application.DoEvents()
End While
这看起来不合逻辑,因为如果网页不是从错误代码竞争,或者从不加载它,而且ReadyState是永远的东西,那么你在这里堆叠,线程永远不会结束加入其余部分!更改此代码 - 我不知道在这里告诉您什么,因为我没有这个代码来调试它,但您可以轻松地在这里放置一个断点,看看哪些代码使它永远循环。
看看这段代码
ConvertedImage.Save("c:\Test.bmp", _
System.Drawing.Imaging.ImageFormat.Bmp)
首先是错误,安全错误代码,无论如何,池可能没有写入C盘根目录的权限。