原来,在 Window2K下实现这个功能还真不容易。在XP下有一个新的API函数,PrintWindow,网上有一段代码。整理如下,测试后发现OK。 PrintWindow 的声明如下: function PrintWindow(SourceWindow: hwnd; Destination: hdc; nFlags: cardinal): bool; stdcall; external 'user32.dll' name 'PrintWindow'; 我们用一小段代码测试一下:
procedure
TForm1.FormCreate(Sender: TObject);
var
bmp : TBitmap;
wnd : cardinal;
rec : TRect;
begin
wnd :
=
FindWindow(
'
windowtitle
'
,
nil
);
//
get the handle
//
of
your window
GetWindowRect(wnd, rec);
bmp :
=
TBitmap.Create;
try
bmp.Width :
=
rec.Right
-
rec.Left;
bmp.Height :
=
rec.Bottom
-
rec.Top;
bmp.PixelFormat :
=
pf24bit;
PrintWindow(wnd, bmp.Canvas.Handle,
0
);
bmp.SaveToFile(
'
d:/window.bmp
'
);
finally
bmp.Free;
end
;
end
;
为一方便使用,我把它整理成了一个常用的函数:
procedure
CaptureWindowToBitmap(WndHandle: HWND; Bitmap: TBitmap);
procedure
DoCaptureWindow;
var
ImageDC: HDC;
R: TRect;
begin
SetForegroundWindow(WndHandle);
Sleep(
200
);
ImageDC :
=
GetWindowDC(WndHandle);
try
GetWindowRect(WndHandle, R);
if
GetWindowLong(WndHandle, GWL_STYLE)
and
WS_MAXIMIZE
<>
0
then
SetRect(R, Abs(R.Left), Abs(R.Top), Abs(R.Right), Abs(R.Bottom))
else
OffsetRect(R,
-
R.Left,
-
R.Top);
with
Bitmap
do
begin
FillRect(Canvas.Handle, Rect(
0
,
0
, Width, Height), GetStockObject(BLACK_BRUSH));
StretchBlt(Canvas.Handle,
0
,
0
, Width, Height, ImageDC, R.Left, R.Top, R.Right
-
R.Left, R.Bottom
-
R.Top, cmSrcCopy);
end
;
finally
ReleaseDC(WndHandle, ImageDC);
end
;
end
;
var
R: TRect;
begin
if
not
Assigned(Bitmap)
then
Exit;
Bitmap.Width :
=
0
;
Bitmap.Height :
=
0
;
GetWindowRect(WndHandle, R);
try
Bitmap.Width :
=
(R.Right
-
R.Left);
Bitmap.Height :
=
(R.Bottom
-
R.Top);
Bitmap.PixelFormat :
=
pf24bit;
if
@PrintWindow
<>
nil
then
PrintWindow(WndHandle, Bitmap.Canvas.Handle,
0
)
else
DoCaptureWindow;
finally
{}
end
;
end
;