首页  编辑  

抓取被窗口遮盖的桌面的图形

Tags: /超级猛料/Picture.图形图像编程/抓图/   Date Created:
抓取被遮住的窗口
以下代码在 Win2000中可以实现抓取被Notepad窗口遮住或者看不见的的窗口的图形。
procedure TForm1.Button1Click(Sender: TObject);
const
  WS_EX_LAYERED = $00080000;
var
  DC: HDC;
  FStyle: Longint;
  FCanvas: TCanvas;
  bmpScreen: TBitmap;
  FHwnd: HWND;
  R: TRect;
begin
  FHwnd := FindWindow('Notepad', nil);
  GetWindowRect(FHwnd, R);
  FStyle := GetWindowLong(FHwnd, GWL_EXSTYLE);
  FStyle := FStyle or WS_EX_LAYERED;
  SetWindowLong(FHwnd, GWL_EXSTYLE, FStyle);
  Sleep(500);
  bmpScreen := TBitmap.Create;
  bmpScreen.Width := R.Right - R.Left;
  bmpScreen.Height := R.Bottom - R.Top;
  bmpScreen.Canvas.Lock;
  DC := GetDC(0);
  with bmpScreen do
    Bitblt(Canvas.Handle, 0, 0, bmpScreen.Width, bmpScreen.Height, DC, R.Left,
      R.Top, SRCCOPY);
  ReleaseDC(0, DC);
  bmpScreen.Canvas.UnLock;
  Image1.Picture.Assign(bmpScreen);
  FStyle := GetWindowLong(FHwnd, GWL_EXSTYLE);
  FStyle := FStyle and (not WS_EX_LAYERED);
  SetWindowLong(FHwnd, GWL_EXSTYLE, FStyle);
end;
如果要抓取在后台的窗口,可以使用以下的代码:
function PrintWindow(hwnd: HWND; hdc: HDC; nFlags: UINT): Boolean; stdcall; external 'user32.dll';
procedure TForm1.btn1Click(Sender: TObject);
var
 h: HWND;
begin
 h := FindWindow('Notepad', nil);
 PrintWindow(h, Canvas.Handle, 0);
end;
上面的代码只能在XP或以上的系统使用。