谁能告诉我如何用directx来抓屏?(详细些),我只能给200分了。我用的是DelphiX(200分)

  • 主题发起人 主题发起人 火凤凰
  • 开始时间 开始时间

火凤凰

Unregistered / Unconfirmed
GUEST, unregistred user!
谁能告诉我如何用directx来抓屏?(详细些),我只能给200分了。我用的是DelphiX
 
很好!终于找到一个志同道合的人了!在论坛上寂寞死了!呵呵!
DirectX有读取屏幕画面的函数接口啊!你查查相关资料就有!
没必要用DelphiX,开发游戏还差不多!杀鸡何必用牛刀!
 
TO:人在边缘,
那个接口函数是什么?我基本没资料可查,只有msdn带的关于directX5的简单资料
 
我也需要这方面资料。
 
[:)]getdc(0)搞不定吗?
 
我想知道用directx的,有人知道吗?高人都哪去了?
 
有些人越来越小气了,自己在DFW学了不少东西,却不给别人说。
 
初始化 directx
create primary surface
设置裁减器大小.
create offline surface
surface.bitblt to offline surface
lock offline surface//得到指向显示屏的指针
move data to your buffer //注意,此步操作速度极慢.会让你很失望的
 
谢谢,楼上的兄弟,让我试试
 
没有这样的函数的...
 
:xwings
lock后再做 效果是否有改观?
 
我试过了, 由于视频缓冲不支持video mem 2 sy smem. 所以 video mem -> sys mem 速度很慢.很慢.

慢的让人失望. ;( 大家知道怎么办么?

to 房客:
我在move 数据的时候, 是lock的.

 
真奇怪!看帖子时,总有人说用directx抓屏如何如何好,可怎么没人来回答我如何如何抓
TO:人在边缘,
你真的知道吗?
TO:xwings
再怒努力
 
别处找的,没试,成功后,别忘了高速一声.[:D]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DXDraws, StdCtrls, StopWatch, DXClass,DIB, DXTexImg, DirectX,csintf;

type
TForm1 = class(TForm)
DXDraw1: TDXDraw;
StopWatch1: TStopWatch;
DXTimer1: TDXTimer;
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);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
FSurface:TDirectDrawSurface;
ScrDC:HDC;
i:Integer;
WW,HH:Integer;
mPos:TPoint;
posX,posY:Integer;
implementation
uses
unit2;
{$R *.DFM}

procedure TForm1.DXDraw1InitializeSurface(Sender: TObject);
begin
FSurface:=TDirectDrawSurface.Create(DXDraw1.DDraw);
//WW:=DXDraw1.Width;
//HH:=DXDraw1.Height;
WW:=640;
HH:=480;
FSurface.SetSize(WW,HH);
FSurface.SystemMemory:=true;
posX:=(fsurface.Width -DXDraw1.Width) div 2;
posY:=(FSurface.Height-DXDraw1.Height) div 2;
fsurface.Fill(0);
ScrDC:=getDC(0);
{ DXDraw1.Primary.SetSize(WW,HH);
DXDraw1.Primary.Fill(20);}
end;

procedure TForm1.DXDraw1FinalizeSurface(Sender: TObject);
begin
FSurface.Free;
FSurface:=nil;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DXTimer1.Enabled:=False;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
DXTimer1.Enabled:=True;
end;

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var
SurfaceDESC:TDDSurfaceDesc;
begin
GetCursorPos(mPos);
//DXTimer1.Enabled:=False;
{ DXDraw1.Primary.Lock(SurfaceDESC);
unit2.showimg(SurfaceDesc.lpSurface,WW*HH*2);
DXDraw1.Primary.UnLock;
//}
FSurface.Fill(11);
BitBlt(FSurface.Canvas.Handle,0,0,WW,HH,ScrDC,mPos.x-WW div 2,mPos.y-HH div 2,SRCCOPY);
FSurface.Canvas.Textout(posX+5, posY+5,IntToStr(fsurface.Width)+' '+IntToStr(FSurface.Height));
FSurface.Canvas.TextOut(posX+5,posY+20,'FPS: '+IntToStr(DXTimer1.FrameRate));
FSurface.Canvas.Release;
//}
if FSurface.Lock(SurfaceDESC)=False then beep;
unit2.showimg(SurfaceDesc.lpSurface,WW*HH*2);
FSurface.UnLock;
//)
if DXDraw1.CanDraw then
begin
DXDraw1.Surface.Draw(0,0, Rect(posX,posY,posX+DXDraw1.Width,posY+DXDraw1.Height),FSurface,false);
//DXDraw1.Surface.StretchDraw(Rect(0,0,DXDraw1.Width,DXDraw1.Height), Rect(posX-200,posY-200,posX+DXDraw1.Width+200,posY+DXDraw1.Height+200),FSurface,false);
{ DXDraw1.Surface.Canvas.TextOut(5,50,'FPS: '+IntToStr(DXTimer1.FrameRate));
DXDraw1.surface.Canvas.release;}
DXDraw1.Flip;
end; //}
end;

end.
 
To:老赵
虽然给的不全,但修改过后,好象真能抓到东西(时时的)
因为用的是TDXTimer,所以必须保证此程序是当前的,你才能看到抓到的动态图片
但CPU占用率太高(100%),
BitBlt(FSurface.Canvas.Handle,0,0,WW,HH,ScrDC,mPos.x-WW div 2,mPos.y-HH div 2,SRCCOPY);
这句给我的感觉好象是普通抓屏,在directX下显示,
高手帮我解析解析……
 
老赵给的好象还是gdi抓屏,
 
这个好像是我写的嘛.怎么到这里来了. ??

这是我的早期例子.不过的确是可以工作的. bitblt也是对的. 在dirextDraw下有硬件加速.
这个不要怀疑了. cpu占用高不是directx的问题. 是timer的问题. 你看虽然cpu占用高.
但是系统其他进程工作还是很快的.
 
to xwings:
不好意思,不知是您的作品,也是无意中发现的,您肯定在哪里'发表'过,让我给'拿来'啦.[:D]
保证绝对不是在您的机器里![^]
[:)][:)][:)]

 
会是这样吗?我怎么不知呀?我是才学delphi,请问各位高手教我一下怎么学delphi?1我的e-mail:chenqi1978@sina.com,我的oicq:6196481
 
后退
顶部