Take a screen shot of an inactive window #186

Taking a screen shot of a window using Delphi code is rather easy.

A screen shot (screen capture) is a copy of the screen's contents that can be saved as a graphics file or displayed in a graphics "aware" control, for example TImage.

In most cases you will want to take a screen shot of the active window or the Windows Desktop.

What if you need to do a screen capture of all the running applications - most of them will be inactive and not visible to the user?

Windows XP introduces the new printing API, PrintWindow. This API enables the caller to snapshot a visual copy of a window into a device context.

Drop a TImage (named Image1) on a form and use the following code:

WindowSnap(Self.Handle, Image1.Picture.Bitmap) ;
Image1.Refresh;

The actual WindowSnap function is defined as:

function WindowSnap(windowHandle: HWND; bmp: TBitmap): boolean;
var
  r: TRect;
  user32DLLHandle: THandle;
  printWindowAPI: function(sourceHandle: HWND; destinationHandle: HDC;
    nFlags: UINT): BOOL; stdcall;
begin
  result := False;
  user32DLLHandle := GetModuleHandle(user32) ;
  if user32DLLHandle <> 0 then
  begin
    @printWindowAPI := GetProcAddress(huser32, 'PrintWindow') ;
    if @printWindowAPI <> nil then
    begin
      GetWindowRect(windowHandle, r) ;
      bmp.Width := r.Right - r.Left;
      bmp.Height := r.Bottom - r.Top;
      bmp.Canvas.Lock;
      try
        result := printWindowAPI(windowHandle, bmp.Canvas.Handle, 0) ;
      finally
        bmp.Canvas.Unlock;
      end;
    end;
  end;
end; (*WindowSnap*)

Note that the first parameter to the WindowSnap function is a HWND value (THandle) - the handle of the window you want to capture.

Author: Unknown
Contributor: Riccardo Faiella (Topellina)
Added: 2012/07/06
Last updated: 2012/07/06