求救:如何窃取一端时间内,显示器上的变化,并把他保存为多媒体文件或电影文件。
就象用摄影机摄显示屏的变化一样

解决方案 »

  1.   

    用windows hook,截获刷新消息,只传输刷新部分
      

  2.   

    Directx抓图:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      DXDraws, StdCtrls,DXClass, DirectX,RLEUnit;type
      TRGB16=TWordArray;
      PRGB16=^TRGB16;  TForm1 = class(TForm)
        DXDraw1: TDXDraw;
        DXTimer1: TDXTimer;
        Label1: TLabel;
        procedure DXDraw1InitializeSurface(Sender: TObject);
        procedure DXDraw1FinalizeSurface(Sender: TObject);    procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormShow(Sender: TObject);
        procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    const
      WW:Integer=640;   //抓屏宽度和高度
      HH:Integer=480;
    var
      Form1: TForm1;
      FSurface:TDirectDrawSurface;
      ScrDC:HDC;
      i:Integer;
      mPos:TPoint;
      posX,posY:Integer;
      ImgBuf:PRGB16;procedure ProcImage(SrcImgBuf:Pointer;Count:integer);
    implementation
    uses
      unit2;
    {$R *.DFM}procedure TForm1.DXDraw1InitializeSurface(Sender: TObject);
    begin
    //Create a offline surface
      FSurface:=TDirectDrawSurface.Create(DXDraw1.DDraw);
      FSurface.SetSize(WW,HH);
      FSurface.SystemMemory:=true;
      fsurface.Fill(0);
    //get Screen DC
      ScrDC:=getDC(0);
    end;procedure TForm1.DXDraw1FinalizeSurface(Sender: TObject);
    begin
      FSurface.Free;
      FSurface:=nil;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ImgBuf:=GlobalAllocPtr(GPTR,WW*HH*2);  //16bitsend;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      DXTimer1.Enabled:=False;
      GlobalFreePtr(ImgBuf);
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
    DXTimer1.Enabled:=True;
    end;procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
    var
    //the structure of surface
      SurfaceDESC:TDDSurfaceDesc;
    begin
      //GetCursorPos(mPos);
      mPos.x:=400;
      mPos.y:=300;
      //clear surface
      FSurface.Fill(0);
      // use hardware bitblt Image form ScreenDC to Surface
      BitBlt(FSurface.Canvas.Handle,0,0,WW,HH,ScrDC,mPos.x-WW div 2,mPos.y-HH div 2,SRCCOPY);
     // Free Surface DC Handel
      FSurface.Canvas.Release;{Get Image Data from Surface bits}
      if FSurface.Lock(SurfaceDESC)=true then
      begin
        ProcImage(SurfaceDesc.lpSurface,WW*HH*2);
        FSurface.UnLock;
      end
      else Beep;
      Caption:=Format('Current FPS: %d',[dxtimer1.FrameRate]);
    end;procedure ProcImage(SrcImgBuf:Pointer;Count:integer);
    begin
      Move(srcImgBuf^,ImgBuf^,Count);
      unit2.showImg(ImgBuf,Count);
    end;
    end.
      

  3.   

    必须用delphi吗?如果不是的话,我知道有flash cam可以实现。