如何截取被看不见的视窗内容?

原来,在 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 ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值