also entweder mach ich was falsch oder es geht nicht
Mit diesem Code mach ich ein Foto:
Delphi-Quellcode:
function ScreenshotHidden(wnd: HWND;
const bmp: TBitmap): Boolean;
var
rec: TRect;
//zum Zwischenspeichern der Fenstergröße
dllh: THandle;
//Handle der user32.dll
PrintWindow:
function(sHandle: HWND; dHandle: HDC; nFlags: UINT): BOOL;
stdcall;
//Prototyp der verwendeten Funktion
begin
Result := False;
//Rückgabewert initialisieren
dllh := GetModuleHandle(user32);
//dll dynamisch laden...
if dllh <> 0
then
begin
@PrintWindow:= GetProcAddress(dllh , '
PrintWindow');
//die Funktionsadresse aus der Dll laden...
if @PrintWindow =
nil then begin
ShowMessage('
@PrintWindow = nil');
end
else begin
GetWindowRect(wnd, rec);
//Größe des Fensters auslesen...
ShowMessage(Format('
left "%d", right "%d", top "%d", bottom "%d"',[rec.Left, rec.Right, rec.Top, rec.Bottom]));
bmp.Width := rec.Right - rec.Left;
//...und die Bitmap-Größe anpassen
bmp.Height := rec.Bottom - rec.Top;
bmp.Canvas.Lock;
//Zugriff auf den Canvas für andere Threads blockieren
try
result := PrintWindow(wnd, bmp.Canvas.Handle, 0);
//Das Fenster zeichnet sich selbst in das HDC des Bitmaps
finally
bmp.Canvas.Unlock;
//Zugriff wieder erlauben
end;
end;
end;
end;
procedure ScreenShot_aktives_Fenster(Bild: TBitMap);
var
c: TCanvas;
r, t: TRect;
h: THandle;
begin
c := TCanvas.Create;
c.Handle := GetWindowDC(GetDesktopWindow);
h := GetForeGroundWindow;
If h <> 0
then
ScreenshotHidden(h, Bild);
end;
Ich nutz meine Procedure um jetzt nicht im Code überall ändern zu müssen und ausserdem wird dort
das
Handle des Fensters ausgelesen (ich hoffe das ist das richtige für die function).
Leider wird trotzdem nur der sichtbare Teil bildlich dargestellt
mfg
Helmi
>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<