抓取被遮住的窗口
以下代码在 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或以上的系统使用。