Ich habe dies nun mit der angegebenen Funktion versucht, ein wenig umgebaut und zur Zeit funktioniert diese Funktion.
Ein Problem ist nur, dass, wenn ich die Zeit "sleep(5)" rausnehme, kommt nur ein schwarzes Fenster ohne Inhalt. Dies könnte Probleme bei anderen Rechnern bringen, denn es wird bestimmt nicht immer die Zeit reichen. Bei langsameren Rechner wird das wohl noch mehr sein.
Die Funktion holt erst die Info, welches Fenster genutzt werden soll und dann wird der Screenshot erzeugt. Man muss nur wissen, wie das Programm unter Windows heißt.
Jetzt fällt nur auf, dass das Fenster aktiv in den Vordergrund gebracht wird. Aber für meine Zwecke sollte es mehr oder weniger immer sichtbar sein.
Danke für die Tipps und eventuelle Verbesserungsmöglichkeiten.
Ergänzung: Wenn das Fenster teilweise über den rechten Rand hinausragt, wird es nicht mehr komplett kopiert, sondern es erscheint rechts ein weißer Streifen.
Delphi-Quellcode:
procedure ScreenShot(wnd: HWND; destBitmap : TBitmap) ;
var
w,h : integer;
DC : HDC;
hWin : Cardinal;
r : TRect;
begin
SetActiveWindow(wnd);
SetForegroundWindow(wnd);
sleep(5);
hWin := GetForegroundWindow;
dc := GetWindowDC(hWin) ;
GetWindowRect(hWin,r) ;
w := r.Right - r.Left;
h := r.Bottom - r.Top;
try
destBitmap.Width := w;
destBitmap.Height := h;
BitBlt(destBitmap.Canvas.Handle,
0,
0,
destBitmap.Width,
destBitmap.Height,
DC,
0,
0,
SRCCOPY) ;
finally
ReleaseDC(hWin,
DC) ;
end;
end;
//und Aufruf
WinName:=Class4Screenshot;
//hier den Namen des Programmes übnergeben
wnd := FindWindow(PChar(WinName),
nil);
//Handle vom Viewer Fenster
if wnd=0
then begin
ShowMessage('
Fenster nicht gefunden für Screenshot "'+WinName+'
"');
end
else begin
b := TBitmap.Create;
try
ScreenShot(wnd, b) ;
Image1.Picture.Bitmap.Assign(b) ;
finally
b.FreeImage;
FreeAndNil(b) ;
end;