Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› Прорисовка поверх чужого IDirectDraw7
Посл.ответ Сообщение

Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 19 апреля 2010 16:08 · Поправил: punxer
· Личное сообщение · #1

Доброго всем времени суток, пытаюсь вывести свои изображения поверх чужой игрушки, будь то FPS хотябы.
Если вызывать ::GetDC проблем нет, но вот не хочется мешать директ дро и гдай, получил указатели на первичную и вторичную поверхности, Flip тоже перехвачен, всю работу провожу в обработчике флипа, стереть проблем нет, с доступом к поверхностям проблем тоже нет, но нужно грузить спрайты и отрисовывать их на вторичной поверхности, сдесь то и собака зарылась. Дополнительные поверхности создать никак не удается, вот код, помогите советом пожалуйсто.

Code:
  1. HRESULT  __stdcall   PASCAL MyIDirectDrawSurface7_Flip(LPDIRECTDRAWSURFACE7 lplpThis,LPDIRECTDRAWSURFACE7* lplpSurf7,DWORD param)
  2.  
  3. {
  4.          LPDIRECTDRAWSURFACE7 lpDDs;
  5.          HRESULT ret=NULL;
  6.          DDSURFACEDESC2 SD;
  7.          DDSCAPS2 caps;
  8.          RECT rc;
  9.          BYTE*   ptr=                  NULL;
  10.          HDC hDC;
  11.  
  12.          DebugPrintF("!!!In lpDDPrimarySurf7->Flip");
  13.  
  14.          if (g_lpDDSurfBack)
  15.          {
  16.                  g_lpDDSurfBack->Lock(NULL,&SD,DDLOCK_WAIT,NULL);
  17.                  
  18.  
  19.  
  20.  
  21.                  g_lpDDSurfBack->Unlock(NULL);
  22.                                        
  23.          }
  24.  
  25.          ret=pIDirectDrawSurface7_Flip(lplpThis,lplpSurf7,param);
  26.          
  27.          
  28.          return ret;
  29. }
  30.  
  31. HRESULT __stdcall PASCAL MyIDirectDraw7_CreateSurface(LPVOID lplpDD,LPDDSURFACEDESC2 lpDDSurfdesc2, LPDIRECTDRAWSURFACE7 FAR *lpDDSurf7, IUnknown FAR * pUnk)
  32. {
  33. #define IDirectDrawSurface7_Flip_OFFSET 44
  34. #define GetAttachedSurface_OFFSET     48
  35.  
  36.          HRESULT ret=            NULL;
  37.  
  38.          ret=pIDirectDraw7_CreateSurface(lplpDD,lpDDSurfdesc2,lpDDSurf7,pUnk);
  39.  
  40.          
  41.  
  42.          DebugPrintF("!!!In lpDD->CreateSurface");
  43.  
  44.          if(lpDDSurfdesc2->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
  45.          {
  46.  
  47.                  //Hook flip and other 
  48.                  DebugPrintF("!!!!!!Primary surface founded");
  49.                  if (lpDDSurfdesc2->dwBackBufferCount==1)
  50.                         DebugPrintF("!!!!!!Primary surface founded!!!!BackBuffer one!!!!!!!!!!");
  51.  
  52.                  g_lpDDSurfPrimary=(LPDIRECTDRAWSURFACE7)*lpDDSurf7;
  53.                  pIDirectDrawSurface7_Flip=(HRESULT(__stdcall   PASCAL*)
  54.                         (LPDIRECTDRAWSURFACE7 lplpThis,LPDIRECTDRAWSURFACE7* lplpSurf7,DWORD param))
  55.                         HookCOM((PVOID*)lpDDSurf7,IDirectDrawSurface7_Flip_OFFSET,(DWORD)My   IDirectDrawSurface7_Flip,52);
  56.  
  57.                  pIDirectDrawSurface7_GetAttachedSurface=(HRESULT(__stdcall   PASCAL*)
  58.                         (LPDIRECTDRAWSURFACE7 lplpThis, LPDDSCAPS2, LPDIRECTDRAWSURFACE7 FAR *))
  59.                         HookCOM((PVOID*)lpDDSurf7,GetAttachedSurface_OFFSET,(DWORD)MyIDirec   tDrawSurface7_GetAttachedSurface,52);
  60.  
  61.  
  62.  
  63.          }       
  64.          return ret;
  65. }
  66.  
  67.  
  68. HRESULT  __stdcall   PASCAL MyIDirectDrawSurface7_GetAttachedSurface(LPDIRECTDRAWSURFACE7 lplpThis, LPDDSCAPS2 lpCaps, LPDIRECTDRAWSURFACE7 FAR * lplpSurf)
  69. {
  70.          HRESULT ret;
  71.          ret=pIDirectDrawSurface7_GetAttachedSurface(lplpThis,lpCaps,lplpSurf)   ;
  72.          DebugPrintF("!!!!!!Primary surface->GetAttachedSurface");
  73.          if (lpCaps->dwCaps & DDSCAPS_BACKBUFFER)
  74.          {
  75.                  DebugPrintF("!!!!!!!!!!!Back Buffer Founded");
  76.                  g_lpDDSurfBack=*lplpSurf;
  77.          }
  78.          
  79.          return ret;
  80. }
  81.  
  82. HRESULT WINAPI MyDirectDrawCreateEx(GUID *lpGuid,LPVOID *lplpDD,const IID &iid,IUnknown *pUnkOuter) 
  83. {
  84. #define CREATE_SURFACE_OFFSET 24
  85.  
  86.          HRESULT ret=            NULL;
  87.          if (ret=pDirectDrawCreateEx(lpGuid,lplpDD,iid,pUnkOuter)==DD_OK)
  88.          {
  89.                  DebugPrintF("DirectDrawCreateEx SUCCESS");
  90.          }
  91.  
  92.  
  93.          <u>g_lpDD=(IDirectDraw7*)*lplpDD;</u>
  94.          DebugPrintF("Load Additional graphics***************************************************");
  95.          g_lpDDSurfBtn1= LoadResBitmap(IDB_BITMAP1);
  96.  
  97.  
  98.  
  99.          pIDirectDraw7_CreateSurface=(HRESULT (__stdcall PASCAL *)
  100.                  (LPVOID lplpDD,LPDDSURFACEDESC2, LPDIRECTDRAWSURFACE7 FAR *, IUnknown FAR *))
  101.                  HookCOM(lplpDD,CREATE_SURFACE_OFFSET,(DWORD) MyIDirectDraw7_CreateSurface,31);
  102.          DebugPrintF("!!CreateSurface hooked");
  103.          
  104.          return ret;
  105.  
  106. }
  107.  
  108. LPDIRECTDRAWSURFACE7 LoadResBitmap(int id)
  109. {
  110.          HBITMAP          hbm     =     NULL;
  111.          HDC        hCompDC    =  NULL;
  112.          HDC            hdc             =    NULL;
  113.          DDSURFACEDESC2 dds;
  114.          
  115.          BITMAP bmp;
  116.          LPDIRECTDRAWSURFACE7 temp;
  117.  
  118.          hbm= (HBITMAP)LoadImageA(g_hInst,MAKEINTRESOURCE(id),IMAGE_BITMAP,0,0,LR_CR EATEDIBSECTION);
  119.          DebugPrintF("HBITMAP hbm=%d",(DWORD)hbm);
  120.  
  121.  
  122.          hCompDC=CreateCompatibleDC(NULL);
  123.          DeleteObject(SelectObject(hCompDC,hbm));
  124.          
  125.          GetObject(hbm,sizeof(BITMAP),&bmp);
  126.          DebugPrintF("WIDTH =%d HEIGHT=%d",bmp.bmWidth,bmp.bmHeight);
  127.  
  128.          temp=CreateCustomSurface(bmp.bmWidth,bmp.bmHeight);
  129.  
  130.          DebugPrintF("lpDDCustomSurface=%d",(DWORD)temp);
  131.  
  132.  
  133.  
  134.          return NULL;
  135.  
  136. }
  137.  
  138. int ClearBackBuffer()
  139. {
  140.          DDBLTFX bltfx;
  141.          memset (&bltfx,0,sizeof(bltfx));
  142.          bltfx.dwSize=sizeof(bltfx);
  143.          bltfx.dwFillColor=0;
  144.          g_lpDDSurfBack->Blt(0,0,0,DDBLT_COLORFILL | DDBLT_WAIT, &bltfx);
  145.          return true;
  146. }
  147.  
  148. <u>LPDIRECTDRAWSURFACE7 CreateCustomSurface(DWORD w, DWORD h)</u>
  149. {
  150.     DDSURFACEDESC2 desc;
  151.          LPDIRECTDRAWSURFACE7 surf =        NULL;
  152.          HRESULT r        =      NULL;
  153.     
  154.          ZeroMemory(&desc, sizeof(desc));
  155.     desc.dwSize = sizeof(desc);
  156.     desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
  157.     desc.dwWidth = w;
  158.     desc.dwHeight = h;
  159.     desc.ddsCaps.dwCaps =DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
  160.     
  161.     r = g_lpDD->CreateSurface(&desc, &surf, NULL);
  162.     if (== DD_OK)
  163.     {
  164.         DebugPrintF("CreateSurface(%d,%d) created in video memory \n", w, h);
  165.         return surf;
  166.     }
  167.  
  168.     desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
  169.     r = g_lpDD->CreateSurface(&desc, &surf, NULL);
  170.     if (== DD_OK)
  171.     {
  172.         DebugPrintF("CreateSurface(%d,%d) allocated in system memory \n", w, h);
  173.         return surf;
  174.     }
  175.  
  176.     DebugPrintF("CreateSurface(%d,%d) failed\n", w, h);
  177.     return NULL;
  178. }






Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 19 апреля 2010 16:09
· Личное сообщение · #2

ClearBackBuffer() отрабатывает нормально в обработчике флипа



Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 22 мая 2010 16:07
· Личное сообщение · #3

вопрос закрыт



Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 22 мая 2010 16:09
· Личное сообщение · #4

Дополнительные поверхности да и вообще поверхности можно создавать после SetDisplayMode and CooperativeLevel



Ранг: 30.0 (посетитель), 4thx
Активность: 0.030.01
Статус: Участник

Создано: 22 мая 2010 16:09
· Личное сообщение · #5

Соответственно создавать их нада в перехваченной SetDisplayMode




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 мая 2010 16:35
· Личное сообщение · #6

Ты правку видел вообще, озверел столько постить? А кнопку Закрыть тему?


 eXeL@B —› Программирование —› Прорисовка поверх чужого IDirectDraw7
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати