| 

.NET C# Java Javascript Exception

5
So schön Windows 7 auch aussieht, umso mehr Probleme macht es mir...

Ich erstelle Screenshots von einzelnen Fenstern, das Image erstelle ich, indem ich mir das Handle des Fensters besorge und folgenden Code aufrufe:

public static Image CaptureWindow(IntPtr handle)
{
IntPtr hdcSrc = GetWindowDC(handle);
Rect windowRect = new Rect();
GetWindowRect(handle, ref windowRect);
int width = windowRect._Right - windowRect._Left;
int height = windowRect._Bottom - windowRect._Top;
IntPtr hdcDest = CreateCompatibleDC(hdcSrc);
IntPtr hBitmap = CreateCompatibleBitmap(hdcSrc, width, height);
IntPtr hOld = SelectObject(hdcDest, hBitmap);

BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, Srccopy | Captureblt);
SelectObject(hdcDest, hOld);
DeleteDC(hdcDest);
ReleaseDC(handle, hdcSrc);
Image img = Image.FromHbitmap(hBitmap);
DeleteObject(hBitmap);
return img;
}


Funktioniert auch alles ganz gut, nur bei einigen Fenstern fehlt die "Umrandung". Wahrscheinlich liegt es am non-client-Bereich oder an layered-Windows. Hier mal ein Beispielbild (das linke Fenster ist komplett, beim rechten fehlt der Rand):



Screenshot

Mit einem kompletten Screenshot, bei dem ich der Funtion das Handle von GetDesktopWindow() übergebe, habe ich das Problem nicht. Allerdings nützt mir das nichts, da ich auch Screenshots von verdeckten Fenstern machen muss.

Kennt irgendwer eine Lösung für das Problem oder eine Alternative zu BitBlt?
News:
29.04.2011
Anika 223 6
1 Antwort
3
Nach langem herumgoogeln hab ich die Lösung gefunden.
Der Code ist soweit korrekt, nur darf man nicht

Image img = Image.FromHbitmap(hBitmap);

verwenden, sondern

Bitmap img = Bitmap.FromHbitmap(hBitmap);


Image besitzt keine Transparenzeigenschaften und kann deshalb die Rahmenfarbe nicht speichern.
02.05.2011
Anika 223 6

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH