WebBrowserの画面キャプチャ への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 YAS  (社会人)
投稿日時
2011/5/3 15:45:24
Webページ全体をキャプチャしたいのなら次のようなコードでどうでしょうか。
ただ,フレームを使っているWebページの場合にはうまくいかないこともあると思います。
ただ,フレームを使っているWebページの場合にはうまくいかないこともあると思います。
Imports System.Runtime.InteropServices
Public Class Form1
Enum DVASPECT As Integer
CONTENT = 1
THUMBNAIL = 2
ICON = 4
DOCPRINT = 8
End Enum
<DllImport("ole32.dll")> _
Public Shared Function OleDraw( _
ByVal pUnk As IntPtr, _
ByVal dwAspect As Integer, _
ByVal hdcDraw As IntPtr, _
ByRef lprcBounds As Rectangle) _
As Integer
End Function
Dim WithEvents WebBrowser1 As New WebBrowser
Dim WithEvents Button1 As New Button
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.WebBrowser1.Dock = DockStyle.Fill
Me.Button1.Text = "キャプチャ"
Me.Controls.AddRange({Button1, WebBrowser1})
Me.WebBrowser1.GoHome()
End Sub
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
Me.Button1.Enabled = True
End Sub
Private Sub WebBrowser1_Navigating(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
Me.Button1.Enabled = False
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim BodyStyle As String = Me.WebBrowser1.Document.Body.Style
Dim BrowserSize As Size = Me.WebBrowser1.Size
Me.WebBrowser1.Visible = False
Me.WebBrowser1.Document.Body.Style &= "overflow-x:hidden;overflow-y:hidden" 'スクロールバーを消す
Dim ImageRect As Rectangle = Me.WebBrowser1.Document.Body.ScrollRectangle
Me.WebBrowser1.Size = ImageRect.Size
Using WebImage As New Bitmap(ImageRect.Size.Width, ImageRect.Size.Height)
Using g As Graphics = Graphics.FromImage(WebImage)
Dim pUnk As IntPtr = Marshal.GetIUnknownForObject(Me.WebBrowser1.ActiveXInstance)
Dim hDc As IntPtr = g.GetHdc
OleDraw(pUnk, DVASPECT.CONTENT, hDc, ImageRect)
g.ReleaseHdc(hDc)
Marshal.Release(pUnk)
End Using
WebImage.Save(My.Computer.FileSystem.SpecialDirectories.Desktop & "\WebImage.bmp")
End Using
Me.WebBrowser1.Size = BrowserSize
Me.WebBrowser1.Document.Body.Style = BodyStyle
Me.WebBrowser1.Visible = True
End Sub
End Class
投稿者 るきお  (社会人)
投稿日時
2011/4/29 23:16:13
こんにちは。
一応下のコードでできますが、WebBrowserコントロールのスクロールバー部分の計算方法がわからなかったのでちょっと不完全です。
対象領域の幅と高さを計算するときにスクロールバーを除いた幅と高さを指定したかったのですが、
その方法がわからず、仮にWindows標準設定のスクロールバーの幅と高さをもとに計算するようにしました。
しかも、スクロールバーがないときもスクロールバー分の領域を引き算してしまいます。
誰かわかる方、改造してみてください。
一応下のコードでできますが、WebBrowserコントロールのスクロールバー部分の計算方法がわからなかったのでちょっと不完全です。
対象領域の幅と高さを計算するときにスクロールバーを除いた幅と高さを指定したかったのですが、
その方法がわからず、仮にWindows標準設定のスクロールバーの幅と高さをもとに計算するようにしました。
しかも、スクロールバーがないときもスクロールバー分の領域を引き算してしまいます。
誰かわかる方、改造してみてください。
Public Class Form1
Private Declare Function PrintWindow Lib "User32" (ByVal hWnd As IntPtr, ByVal hdcBlt As IntPtr, ByVal nFlags As Integer) As Boolean
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
'▼コピー対象領域の幅と高さを計算
'WebBrowserコントロールのスクロールバーを除いた領域の計算方法がわからなかったので仮。
Dim clientWidth As Integer = WebBrowser1.Size.Width - SystemInformation.VerticalScrollBarWidth
Dim clientHeight As Integer = WebBrowser1.Size.Height - SystemInformation.HorizontalScrollBarHeight
'▼一時的な画像保存領域を確保
Dim image As New Bitmap(clientWidth, clientHeight)
'▼WebBrowserコントロールからimage変数に画像をコピー
Using targetGraphics As Graphics = Graphics.FromImage(image)
Dim hDC As IntPtr = targetGraphics.GetHdc()
PrintWindow(WebBrowser1.Handle, hDC, 0)
targetGraphics.ReleaseHdc(hDC)
End Using
'▼image変数の内容をファイルに保存
image.Save("C:\vb\webbrowser.bmp")
image.Dispose()
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
WebBrowser1.Navigate("http://www.nifty.com/")
End Sub
End Class
投稿者 777  (社会人)
投稿日時
2011/4/29 20:08:34
他のソフトは使わず、ボタンクリック時にWebBrowser内をキャプチャしたいんです。
投稿者 O-157  (その他)
投稿日時
2011/4/29 19:01:08
画面をキャプチャすればいいと思います。
投稿者 777  (社会人)
投稿日時
2011/4/29 18:21:17
Button1をクリックすると、WebBrowser内のページをキャプチャし、保存する場所を指定して保存できるコードはありますか?
1.ボタンやメニューストリップを追加してボタンなどをダブルクリックして
SendKeys.SendWait("%{PRTSC}")
と入力
そしてペイントを起動。編集→貼付けでブラワザの様子を保存することができます。