求救(100分):如何窃取一端时间内,显示器上的变化,并把他保存为多媒体文件或电影文件 求救:如何窃取一端时间内,显示器上的变化,并把他保存为多媒体文件或电影文件。就象用摄影机摄显示屏的变化一样 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用windows hook,截获刷新消息,只传输刷新部分 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);implementationuses 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);beginDXTimer1.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. 必须用delphi吗?如果不是的话,我知道有flash cam可以实现。 动态生成的控件莫名其妙失效 delphi执行查询语句时的进度条怎么做 界面问题:如何将一个窗口切分为三个窗口(如:VC中的切分窗口,每个窗口一个视图) 关于一个正则表达式 如何定位到listview下的一个item 关于颜色的设置?在线!2小时结题! 哪里有DELPHI6的安装程序制作工具 低级问题,我的程序无缘无故就找不到 .dcu文件 高分请教!!! 组合框问题 根据 藠L 得到一段数字,可能为7位数? 头痛!问题出在哪里?! 我该怎么办?
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.