Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0024: Fotografie des Bildschirms erstellen

 von 

Beschreibung

Erstellen einer Bitmap mit dem Inhalt des Bildschirms unter Zuhilfenahme von GDI-Funktionen.

Für neuere Framework-Versionen empfehlen wir die Verwendung von Bildschirmfoto (Screenshot) erstellen [Tipp 0060].

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003

Download:

Download des Beispielprojektes [4,25 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2002/2003
' Option Strict:    An
' Option Explicit:  An
'
' Referenzen: 
'  - System
'  - System.Drawing
'  - System.Windows.Forms
'

' ##############################################################################
' ################################ MainForm.vb #################################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports System
Imports System.Windows.Forms

' <remarks>
'   Hauptformular der Anwendung.
' </remarks>
Public Class MainForm
    Inherits System.Windows.Forms.Form

    Private m_ssgen As ScreenshotGenerator


    Private Sub btnCapture_Click( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs) _
      Handles btnCapture.Click
        Me.picScreenshot.Image = m_ssgen.Capture()
    End Sub
End Class
' ##############################################################################
' ########################## ScreenshotGenerator.vb ############################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports System
Imports System.Drawing

' <remarks>
'   Stellt Funktionalität zum Erstellen von 
'   Bildschirmfotos bereit.
' </remarks>
Public Class ScreenshotGenerator
#Region " API-Deklarationen "
    Private Declare Function GetDesktopWindow Lib "user32.dll" () As IntPtr

    Private Declare Function GetDC Lib "user32.dll" ( _
      ByVal hWnd As IntPtr) As IntPtr

    Private Declare Function ReleaseDC Lib "user32.dll" ( _
      ByVal hWnd As IntPtr, _
      ByVal hdc As IntPtr) As Int32

    Private Declare Function GetWindowRect Lib "user32.dll" ( _
      ByVal hWnd As IntPtr, _
      ByRef lpRect As RECT) As Int32

    Private Declare Function ScreenToClient Lib "user32.dll" ( _
      ByVal hWnd As IntPtr, _
      ByRef lpPoint As POINTAPI) As Int32

    Private Structure POINTAPI
        Public x As Int32
        Public y As Int32
    End Structure

    Private Structure RECT
        Public Left As Int32
        Public Top As Int32
        Public Right As Int32
        Public Bottom As Int32
    End Structure

    Private Declare Function StretchBlt Lib "gdi32.dll" ( _
      ByVal hdc As IntPtr, _
      ByVal x As Int32, _
      ByVal y As Int32, _
      ByVal nWidth As Int32, _
      ByVal nHeight As Int32, _
      ByVal hSrcDC As IntPtr, _
      ByVal xSrc As Int32, _
      ByVal ySrc As Int32, _
      ByVal nSrcWidth As Int32, _
      ByVal nSrcHeight As Int32, _
      ByVal dwRop As Int32) As Int32

    Private Const SRCCOPY As Int32 = &HCC0020
#End Region

    Private m_intptrWindow As IntPtr

    ' <summary>
    '   Gibt das Handle des zu fotografierenden 
    '   Fensters an oder gibt es zurück. Der Wert 0 gibt
    '   an, dass der gesamte Desktop eingefangen werden soll.
    ' </summary>
    ' <value>Handle des zu fotografierenden Fensters.</value>
    Public Property Window() As IntPtr
        Get
            Return m_intptrWindow
        End Get
        Set(ByVal Value As IntPtr)
            m_intptrWindow = Value
        End Set
    End Property

    ' <summary>
    '   Gibt eine Bitmap in Grösse des in der 
    '   Eigenschaft <c>Window</c> angegebenen Fensters mit
    '   dessen Inhalt zurück.
    ' </summary>
    ' <returns>Bitmap, die ein Bildschirmfoto 
    '   eines Fensters enthält.</returns>
    Public Function Capture() As Bitmap
        Dim hWndWindowToCapture As IntPtr
        If Me.Window.Equals(IntPtr.Zero) Then

            ' Handle auf Desktop ermitteln.
            hWndWindowToCapture = GetDesktopWindow()
        Else
            hWndWindowToCapture = Me.Window
        End If

        ' Rechteck mit Massen des Desktops ermitteln.
        Dim rct As RECT
        GetWindowRect(hWndWindowToCapture, rct)

        Dim intWidth As Int32 = rct.Right - rct.Left
        Dim intHeight As Int32 = rct.Bottom - rct.Top

        ' Koordinaten in Client-Koordinaten transformieren.
        Dim pt As POINTAPI
        pt.y = rct.Top
        pt.x = rct.Left
        ScreenToClient(hWndWindowToCapture, pt)
        rct.Left = pt.x
        rct.Top = pt.y

        ' Erstellen einer Bitmap, die den Screenshot 
        ' aufnehmen kann (in Grösse des Desktops).
        Dim b As Bitmap = New Bitmap(intWidth, intHeight)

        ' Erstellen eines Graphics-Objekts zur Bitmap, 
        ' um in sie zu zeichnen.
        Dim g As Graphics = Graphics.FromImage(b)

        ' Erstellen eines Handles auf den Device 
        ' Context des Desktops.
        Dim hdcWindow As IntPtr = GetDC(hWndWindowToCapture)

        ' Ermitteln eines Handles auf den Device 
        ' Context des Graphics-Objekts
        ' zur Ziel-Bitmap.
        Dim hdc As IntPtr = g.GetHdc()

        ' Zeichnen des Inhalts des Desktop-DCs 
        ' in den DC der Bitmap.
        StretchBlt( _
            hdc, _
            0, _
            0, _
            intWidth, _
            intHeight, _
            hdcWindow, _
            rct.Left, _
            rct.Top, _
            intWidth, _
            intHeight, _
            SRCCOPY _
        )

        ' Handles freigeben.
        ReleaseDC(hWndWindowToCapture, hdcWindow)
        g.ReleaseHdc(hdc)

        ' Erstellte Grafik zurückgeben.
        Return b
    End Function
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 5 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von jack am 06.07.2008 um 18:11

hallo,

ist es irgendwie moeglich einen screenshot von nur einem gewissen teil des bildschirms zu machen?

waere sehr dankbar... :)

Kommentar von windowsvistafan am 10.12.2007 um 16:07

Hallo, erst mal ein sehr netter Code, aber eins verstehe ich nicht... In dem Code der MainForm:

Private Sub btnCapture_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnCapture.Click
Me.picScreenshot.Image = m_ssgen.Capture()
End Sub

Dieses "m_ssgen"... Was ist das? Das funktioniert bei mir nicht, er wird immer blau unterstrichen. Was muss man da machen?

Danke

Kommentar von Moritz am 07.07.2004 um 17:35

Nette Idee ...
Ich habs gleich mal testen können, da das normal "Druck" bei einer Anwendung zu langsam war wo ich den SplashScreen haben wollte.
Habs mal erweitert das man das Bild in die Zwischenablage kopiert. Mit ein bißchen Feinarbeit kann man das richtig brauchen ^^.

Jetzt müsste man nur noch auf die Auswahl auf Client Fenster beschränken.

Kommentar von Florian Bayer am 27.05.2004 um 16:01

Stimmt, aber wenn man das ganze gür ein Programm braucht muss man schon den Code verwenden. Oder soll man es so machen wenn man den Menüpunkt Bildschirm fotografieren auswählt:
Meldung: Um diese Funktion zu nutzen, verwenden sie bitte die [DRUCK] bzw. [Rrint Screen] taste.
Ha, ha, ha ;-) { _ }

Kommentar von Dominic Griesel am 14.04.2004 um 14:43

Wenn man per [DRUCK]-Taste einen Screenshot machen will, gehts aber auch einfacher!