Da ich einen Screenshot unter Win2000 brauche, hilft mir die Funktion "Printwindow" nicht weiter. Diese gibt es erst ab XP.
Nun habe ich versucht, mit LuckieDIPS mir was zusammenzubauen, aber die Windowsfunktionen sind nicht so mein Ding.
Ich habe mal meinen Versuch angehängt, aber er bringt nur immer eine weißes Canvas und sonst nichts.
Hat jemand eine fertige Funktion dafür, abgesehen von der
DLL, die vorher erwähnt wurde?
Delphi-Quellcode:
function ScreenshotHidden1(wnd: HWND; const bmp: TBitmap): Boolean;
var
rec: TRect; //zum Zwischenspeichern der Fenstergröße
caption: string;
Size : Cardinal;
MemLocal : ^TBitmap;
MemRemote : ^TBitmap;
Process : THandle;
ProcessId : DWORD;
NumBytes : Cardinal;
ListView : HWND;
b : TBitmap;
InfoHeaderSize : Cardinal;
ImageSize : Cardinal;
begin
Result := False; //Rückgabewert initialisieren
GetWindowRect(wnd, rec); //Größe des Fensters auslesen...
bmp.Width := rec.Right - rec.Left; //...und die Bitmap-Größe anpassen
bmp.Height := rec.Bottom - rec.Top;
bmp.PixelFormat := pf24Bit; // Datenmassen in Zaum halten
bmp.SetSize (bmp.Width, bmp.Height);
{Graphics.}GetDIBSizes (bmp.Handle, InfoHeaderSize, ImageSize);
bmp.Canvas.Lock; //Zugriff auf den Canvas für andere Threads blockieren
ShowMessage(Format('Breite "%d", Höhe "%d"',[bmp.Width,bmp.Height]));
try
b:=TBitmap.Create;
b.Width:=bmp.Width;
b.Height:=bmp.Height;
b.PixelFormat:=bmp.PixelFormat;
// Fensterhandle des Desktop-ListView ermitteln und Prozess oeffnen
ListView := wnd;
ProcessId := 0;
GetWindowThreadProcessId(ListView, @ProcessId);
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or
PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcessId);
if Process <> 0 then begin
try
Size := ImageSize;
MemRemote := VirtualAllocEx(Process, nil, Size, MEM_COMMIT, PAGE_READWRITE);
MemLocal := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);
if Assigned(MemLocal) and Assigned(MemRemote) then begin
SendMessage(wnd, WM_PRINT, Integer(MemRemote), PRF_ERASEBKGND or PRF_CLIENT or PRF_CHILDREN);
end;
if ReadProcessMemory(Process, MemRemote, bmp.Canvas, Size, NumBytes) then begin
end;
except
end;
end;
finally
bmp.Canvas.Unlock; //Zugriff wieder erlauben
end;
end;