Ekran Görüntüsü - Farklı Sorun

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 09:42

Re: Ekran Görüntüsü - Farklı Sorun

Mesaj gönderen destiny24 »

Arkadaşlar DirectX ile nasıl ekran görüntüsü alabilirim. Hiç bir kaynak bulamadım
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Ekran Görüntüsü - Farklı Sorun

Mesaj gönderen thelvaci »

Aşağıdaki kod bloğu ile alabilirsiniz;

Kod: Tümünü seç

uses
  Direct3D9,D3DX9;

procedure TForm1.CaptureScreen(Const FileName: string);
var
  BitsPerPixel  : Byte;
  pD3D          : IDirect3D9;
  pSurface      : IDirect3DSurface9;
  g_pD3DDevice  : IDirect3DDevice9;
  D3DPP         : TD3DPresentParameters;
  ARect         : TRect;
  LockedRect    : TD3DLockedRect;
  BMP           : TBitmap;
  i, p          : Integer;
begin
  BitsPerPixel := GetDeviceCaps(Canvas.Handle, BITSPIXEL);
  FillChar(d3dpp, SizeOf(d3dpp), 0);
  D3DPP.Windowed := True;
  D3DPP.Flags := D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
  D3DPP.SwapEffect := D3DSWAPEFFECT_DISCARD;
  D3DPP.BackBufferWidth := Screen.Width;
  D3DPP.BackBufferHeight := Screen.Height;
  D3DPP.BackBufferFormat := D3DFMT_X8R8G8B8;
  pD3D := Direct3DCreate9(D3D_SDK_VERSION);
  pD3D.CreateDevice(
                    D3DADAPTER_DEFAULT,
                    D3DDEVTYPE_HAL,
                    GetDesktopWindow,
                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                    @D3DPP,
                    g_pD3DDevice
                    );
  g_pD3DDevice.CreateOffscreenPlainSurface(
                                          Screen.Width,
                                          Screen.Height,
                                          D3DFMT_A8R8G8B8,
                                          D3DPOOL_SCRATCH,
                                          pSurface,
                                          nil
                                          );
  g_pD3DDevice.GetFrontBufferData(0, pSurface);

  ARect := Screen.DesktopRect;
  pSurface.LockRect(
                    LockedRect,
                    @ARect,
                    D3DLOCK_NO_DIRTY_UPDATE or
                    D3DLOCK_NOSYSLOCK or
                    D3DLOCK_READONLY
                    );

  BMP := TBitmap.Create;
  BMP.Width := Screen.Width;
  BMP.Height := Screen.Height;

  case BitsPerPixel of
      8 : BMP.PixelFormat := pf8bit;
      16: BMP.PixelFormat := pf16bit;
      24: BMP.PixelFormat := pf24bit;
      32: BMP.PixelFormat := pf32bit;
  end;

  p := Cardinal(LockedRect.pBits);

  for i := 0 to Screen.Height - 1 do
  begin
    CopyMemory(
                BMP.ScanLine[i],
                Ptr(p),
                Screen.Width * BitsPerPixel div 8
              );
    p := p + LockedRect.Pitch;
  end;

  BMP.SaveToFile(FileName);
  BMP.Free;
  pSurface.UnlockRect;
end;
destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 09:42

Re: Ekran Görüntüsü - Farklı Sorun

Mesaj gönderen destiny24 »

Öncelikle Kod Bloğu İçin Teşekkür Ederim Ancak Şöyle Bir Durum Var.
Oyun Kapalı İken başarılı bir şekilde ekran görüntüsü alabilirken oyun açıkken aşağıdaki satırdan değer nil döndüğü için Access hatası alıyorum.

pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, @D3DPP, g_pD3DDevice);

g_pD3DDevice değişkeni Nil geldiği için
g_pD3DDevice.CreateOffscreenPlainSurface(Screen.Width, Screen.Height,
D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, pSurface, nil);

satırında hata veriyor.

Bunun nedeni oyun açıkken ekran kartı üzerine koruma koyuyor olabilir mi.?
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Ekran Görüntüsü - Farklı Sorun

Mesaj gönderen thelvaci »

Makinanızda DirectX'in sürümünden kaynaklanan bir problem olabilir. Size örnek teşkil etmesi için gönderdiğim kodu bir oyun açık iken denedim ve ekran görüntüsünü alabildim. dxdiag ile sisteminizdeki DirectX ile ilgili bir sorun olup olmadığına bir bakmalısınız, her ihtimale karşı güncel bir DirectX kurmayı da deneyebilirsiniz. CaptureScreen isimli metodu, oyununuz açıkken ve ön planda iken çalıştırmayı deneyin bir de arzu ederseniz. Arka plana bir timer koyun zamanlamasını bir kaç saniye sonraya ayarlayın ve o arada hızlıca oyuna geçin; kod ön planda oyun aktif iken çalışmayı denesin bir de bakalım bu durumda bir sıkıntı yaşanacak mı.. ?
destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 09:42

Re: Ekran Görüntüsü - Farklı Sorun

Mesaj gönderen destiny24 »

DirectX de sorun yok gibi gözüküyor.Ayrıca oyun pencere modunda iken oyunun olduğu ekranın görüntüsünü alabiliyorum ancak oyunda pencere modunu kapatıp tam ekran oynadığmda görüntü alamıyorum.Bahsettiğim Oyun Point Blank Aslında.

Hem dediğiniz gibi denemiştim zaten, Timer Interval 5000 iken programı çalıştırıp oyunu açıyorum bu metod'da hata veriyor.

Anlamadım Gitti Arkadaş..


Resim
destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 09:42

Re: Ekran Görüntüsü - Farklı Sorun

Mesaj gönderen destiny24 »

Arkadaşlar uzun zamandır bu hatanın çözümünü arıyorum. Ancak bulamadım, yardım edebilecek birisi var mı ..?
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Ekran Görüntüsü - Farklı Sorun

Mesaj gönderen anonymousdelphicoder »

bende de aynı hatayı veriyor bende denedim sayın Tuğrul Hocam aynı noktada bende de hata mevcut
Cevapla