WebBrowserの画面キャプチャ への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 ゆっきー  (小学生) 投稿日時 2011/12/4 03:10:47
保存先を指定して保存する方法は知りませんが・・・
1.ボタンやメニューストリップを追加してボタンなどをダブルクリックして

SendKeys.SendWait("%{PRTSC}")
と入力

そしてペイントを起動。編集→貼付けでブラワザの様子を保存することができます。

投稿者 YAS  (社会人) 投稿日時 2011/5/3 15:45:24
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.ObjectByVal 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 ObjectByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Me.Button1.Enabled = True
    End Sub

    Private Sub WebBrowser1_Navigating(ByVal sender As ObjectByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
        Me.Button1.Enabled = False
    End Sub

    Private Sub Button1_Click(ByVal sender As ObjectByVal 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標準設定のスクロールバーの幅と高さをもとに計算するようにしました。
しかも、スクロールバーがないときもスクロールバー分の領域を引き算してしまいます。
誰かわかる方、改造してみてください。

  
Public Class Form1

    Private Declare Function PrintWindow Lib "User32" (ByVal hWnd As IntPtr, ByVal hdcBlt As IntPtr, ByVal nFlags As IntegerAs 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内のページをキャプチャし、保存する場所を指定して保存できるコードはありますか?