VB.NET-Tipp 0024: Fotografie des Bildschirms erstellen
von Herfried Wagner
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: | Framework-Version(en): .NET Framework 1.0, .NET Framework 1.1 | .NET-Version(en): Visual Basic 2002, Visual Basic 2003 | Download: |
' 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!