Directx Overlay

0

Witam

Wiem ze sa 2 metody nakladania wlasnej grafiki na pelno ekranowe aplikacje wykozystuujace directx

  • pierwsza to injection czyli podklejanie dllki pod program, udalo mi sie to zrobic ale jest z tym za duzo problemow

Mnie nastomiast interesuje druga metoda czyli rysowanie po tej aplikacji wsprost z naszej bez wstrzykiwania kodu.

Nie znalazlem w delphi zadnego dzialajacego przykladu pod ta metode, widzialem tylko cos w c++ , ale minusem jest usuwanie stylow dolnego paska(windows 7) przy uruchamianiu, ciekawe dlaczego tak sie dzieje.

Może ktoś wie jak to zrobic albo nakieruje mnie na jakieś przykłady w delphi?

Pozdrawiam.

0

moze to cos cie oswieci

gdzie
LPDIRECTDRAWSURFACE7 lpDDSPrimary, lpDDSBack; // DD Surface COM interfaces

// TranPanel1->Handle
// DC = GetDC (DX_RENDER->lpDDSPrimary) ;

DestBitmap->Width = TranPanel1->Width ;
DestBitmap->Height = TranPanel1->Height ;
BitBlt(DestBitmap->Canvas->Handle, 0, 0, DestBitmap->Width, DestBitmap->Height, DC, 0, 0, SRCCOPY) ;

ReleaseDC (DX_RENDER->lpDDSPrimary, DC) ;

tak mozna pobierac piksele jakbedziemymieli lpDDSPrimary
tylko ze trzeba dac surface->Lock();

narysowac cos

surface-Release();

przynajmniej tak to pamietam :P

0

Pokombinuje z tym.

Mam jeszcze jedno pytanko jesli chodzi o metode 1

mam problem z "uwalnianiem" tekstur podczas zakończenia działania programu pod który podpielem swoja ddlke

wyrzuca mi błąd user image

Wiem ,że chodzi o to, że zmienna "Texture1: Direct3D9.IDirect3DTexture9" do której ładuje teksture nie czysci sie przy wyjsciu.
trzeba chyba zrobic hook na procedure uwalniania.

Tylko za Chiny nie wiem jak to zrobic :/

W zalaczniku caly projekt:
SimpleSample.exe - przyklad pustego projektu w directx
D3D9.dll - skompilowana dllka która SimpleSample.exe uruchamia automatycznie

samo SimpleSample.exe pokazuje pusty obraz natomiast gdy w folderze jest D3D9.dll powinien sie rysowac obrazek

jak bedziecie probowali wyjsc z programu to wyskoczy ten blad ktory wczesniej wkleilem

Probowalem tworzyc i wczytywac tekstury w samej procedurze PresentCallback i zadzialalo , nie wywala blad ale jest to totalnie bez sensu bo przy kazdej klatce program na nowo tworzy teksture i laduje do niej plik co powoduje strasznie duzy spadek fps :/

Ma ktos pomysl jak hooknac czyszczenie tekstur przy wylaczaniu programu SimpleSample.exe zeby nie wyskakiwal ten blad? (SimpleSample.exe jest nie do ruszenia taki warunek ;) )

Źródło+demo
http://www.speedyshare.com/files/26499232/overlay.zip

0

przeczytalem kilka zdan i na razie napisze ci tyle
#define SAFERELEASE(x) if (x) { x->Release(); x = NULL; }

// Create a clipper
LPDIRECTDRAWCLIPPER lpClipper=NULL;
if (SUCCEEDED(LastHr = lpDD->CreateClipper(0, &lpClipper, NULL)))
{
lpClipper->SetHWnd(0, ((TWinControl*)AParent)->Handle);
lpDDSPrimary->SetClipper(lpClipper);
}
SAFERELEASE(lpClipper); // The clipper's reference count
// was increased by SetClipper.

if (lpDevice) lpDevice->SetTexture(0, NULL);

// lpDevice->Release(); lpD3D->Release();
SAFERELEASE(lpDevice);
SAFERELEASE(lpD3D);
SAFERELEASE(lpDDSTexture);
SAFERELEASE(lpDDSBack);
SAFERELEASE(lpDDSPrimary);
SAFERELEASE(lpDD);
DDInitialized = false;

0

A może są jakieś przykłady do tego załączone w bibliotekach DelphiX albo Omega? One są ze źródłami, więc w nich powinno dać się znaleźć, jak to rozwiązano.

0

..c w ogóle nie jarze co napisałeś :P

W przykładach do directx sdk pod delphi jest wyładowanie tekstur podczas zamykania formy

tworza forme

 
var
{$ENDIF}
  wc: TWndClassEx = (
    cbSize: SizeOf(TWndClassEx);
    style: CS_CLASSDC;
    {$IFDEF FPC}
    lpfnWndProc: MsgProc;
    {$ELSE}
    lpfnWndProc: @MsgProc;
    {$ENDIF}
    cbClsExtra: 0;
    cbWndExtra: 0;
    hInstance: 0; // - filled later
    hIcon: 0;
    hCursor: 0;
    hbrBackground: 0;
    lpszMenuName: nil;
    lpszClassName: 'D3D Tutorial';
    hIconSm: 0);
var
  hWindow: HWND;
  msg: TMsg;
begin
  // Register the window class
  wc.hInstance:= GetModuleHandle(nil);
  RegisterClassEx(wc);

  // Create the application's window
  hWindow := CreateWindow('D3D Tutorial', 'D3D Tutorial 05: Textures',
                          WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                          0, 0, wc.hInstance, nil);

  // Initialize Direct3D
  if SUCCEEDED(InitD3D(hWindow)) then
  begin
    // Create the scene geometry
    if SUCCEEDED(InitGeometry) then
    begin
      // Show the window
      ShowWindow(hWindow, SW_SHOWDEFAULT);
      UpdateWindow(hWindow);

      // Enter the message loop
      FillChar(msg, SizeOf(msg), 0);
      while (msg.message <> WM_QUIT) do
      begin
        if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then
        begin
          TranslateMessage(msg);
          DispatchMessage(msg);
        end else
          Render;
      end;
    end;
  end;

  UnregisterClass('D3D Tutorial', wc.hInstance);
end.

procedurka przechwytujaca zamkniecie okna

function MsgProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  case uMsg of
    WM_DESTROY:
    begin
  if (g_pTexture <> nil) then
    {$IFDEF TMT}
    g_pTexture.Release;
    {$ELSE}
    g_pTexture:= nil;
    {$ENDIF}


  if (g_pVB <> nil) then
    {$IFDEF TMT}
    g_pVB.Release;
    {$ELSE}
    g_pVB:= nil;
    {$ENDIF}

  if (g_pd3dDevice <> nil) then
    {$IFDEF TMT}
    g_pd3dDevice.Release;
    {$ELSE}
    g_pd3dDevice:= nil;
    {$ENDIF}

  if (g_pD3D <> nil) then
    {$IFDEF TMT}
    g_pD3D.Release;
    {$ELSE}
    g_pD3D:= nil;
    {$ENDIF}
end;
      PostQuitMessage(0);
      Result:= 0;
      Exit;
    end;
  end;

  Result:= DefWindowProc(hWnd, uMsg, wParam, lParam);
end;

 

Problem tylko ze moja dllka nie ma miec zadnej formy, jak w takiej dllce wykryc zdarzenie wyladowania tekstur z device?

dziwne bo funkcja do tworzenia da sie przechwycic
function Direct3DCreate9(SDKVersion: cardinal): Pointer; stdcall;

a przydalo by sie cos w stylu
function Direct3DDestroy9(SDKVersion: cardinal): Pointer; stdcall;

:)

Jakies pomysly?

0

Może przynajmniej ktoś zna jakies forum (moze byc zagraniczne eng) gdzie zajmuja sie typowo programowaniem przy uzyciu directx i mi pomoga?

0

Wpisz w googla charakterystyczne frazy dotyczące programowania w directx. Google powinien znaleźć jakieś przykłady, a nawet całe kody źródłowe. Polecam też Binga.

1 użytkowników online, w tym zalogowanych: 0, gości: 1