Function PrintWindow(ahwnd:HWND; hdcBlt:HDC; nFlags:UINT): Bool; Stdcall; External 'User32.dll' name 'PrintWindow';
Implementation
Uses testwnd; { juste pour tester le code }
{$R *.dfm}
// Prend un instantané du hwnd de la fenêtre,
// stocké dans le contexte de périphérique hdcMem de la mémoire
// cette méthode fonctionne même si la fenêtre n'est pas
// en avant plan ou se trouve en dehors de la zone écran
Function GetFullWindowImage(aHandle : THandle):TBitmap;
Var DC, hdcMem : HDC;
aRect : TRect;
hBMP : HBitmap;
aWidth, aHeight : Integer;
Begin
Result := Nil;
dc := GetWindowDC(0);
If (dc > 0) Then
Try
hdcMem := CreateCompatibleDC(dc);
If (hdcMem > 0) Then
Try
GetWindowRect(aHandle, aRect);
aWidth := aRect.Right-aRect.Left;
aHeight := aRect.Bottom-aRect.Top;
hBMP := CreateCompatibleBitmap(dc, aWidth, aHeight);
If (hBMP > 0) Then
Try
SelectObject(hdcMem, hBMP);
PrintWindow(aHandle, hdcMem, 0);
Result := TBitmap.Create;
Result.Width := aWidth;
Result.Height := aHeight;
BitBlt(Result.Canvas.Handle, 0, 0, aWidth, aHeight, hdcMem, 0, 0, srcCopy);
Finally
DeleteObject(hBMP);
End;
Finally
DeleteObject(hdcMem);
End;
Finally
ReleaseDC(0, dc);
End;
End;
{ exemple d'utilisation}
Procedure TForm1.Button3Click(Sender: TObject);
Var FormImage : TBitmap;
Begin
FormImage := GetFullWindowImage(testfrm.Handle);
Try
Image1.Picture.Bitmap.Assign(FormImage);
Finally
FormImage.Free;
End;
End;