PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VB.net: Screenshotting


MeLLe
2004-05-07, 13:23:41
Hallo Mädels,
ich versuche mich gerade an einem Problem, was mich noch zu Verzweiflung treibt - wie erzeuge ich in VB.net einen Screenshot des Desktops, und sichere den dann nachher in einer Datei?
Zur Zeit habe ich das ganze so implementiert:

Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As IntPtr, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Public Const SRCCOPY = &HCC0020

Dim hDW As Long
Dim DWhDC As Long
hDW = GetDesktopWindow
DWhDC = GetDC(hDW)

Dim img As New Bitmap(1280, 1024)
Dim gfx As Graphics = CreateGraphics.FromImage(img)
Dim imgDC As IntPtr = gfx.GetHdc

BitBlt(imgDC, 0, 0, 1280, 1024, DWhDC, 0, 0, SRCCOPY)

img.Save("desktop.bmp", Imaging.ImageFormat.Bmp)

gfx.ReleaseHdc(imgDC)

Eine Datei wird auch erzeugt. Nur leider ist das ganze ein komplett schwarzes Bild in 1280x1024. Warum? Was mache ich falsch?

Habt ihr ne Idee? Wäre super.
Danke!

Mädel
2004-05-07, 14:07:10
Versuch es mal mit

StretchBlt(imgDC, 0, 0, 1280, 1024, DWhDC, 0, 0, 1280,1024, SRCCOPY)
anstatt mit BitBlt.

Imo kopiert BilBlt nur die Farbdaten, StretchBlt aber die Bitmap.

G(a)st
2004-05-07, 14:45:48
OT: Heisst das jetzt eigentlich Screenshotting oder Screenshooting? ;)

MeLLe
2004-05-08, 08:31:52
Original geschrieben von Mädel
Versuch es mal mit

StretchBlt(imgDC, 0, 0, 1280, 1024, DWhDC, 0, 0, 1280,1024, SRCCOPY)
anstatt mit BitBlt.

Imo kopiert BilBlt nur die Farbdaten, StretchBlt aber die Bitmap.
Das wäre ein Versuch wert - Danke! Ich werds am Montag auf Arbeit mal ausprobieren.
Zur Zeit habe ich folgenden temporären Hack zum Screensho(o/t)ten eingebaut:

Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Public Const KEYEVENTF_KEYUP = &H2
Public Const VK_MENU = &H12
Public Const VK_SNAPSHOT = &H2C

[...]

Dim cb as Clipboard
Dim img as Image
keybd_event VK_SNAPSHOT, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0
img = cb.GetDataObject.GetData(DataFormats.Bitmap)
img.Save("Screenshot.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)