代码
#include 
#include 

CApiHook hookDx8;
NewD3Device8
* lpDevice=0;
CGame game;


LRESULT CALLBACK FilterWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
IDirect3D8
* WINAPI Direct3DCreate8_Mine(UINT SDKVersion);



void OnDllLoad(void)
{


game.Init (); 
game.ClientSocketInit();

game.HookOpenResFunc (
0);

hookDx8.HookApi (
"d3d8.dll","Direct3DCreate8",Direct3DCreate8_Mine); 

}


IDirect3D8
* WINAPI Direct3DCreate8_Mine(UINT SDKVersion)
{

static int nTimes=0;

IDirect3D8 
*d3d8temp=NULL;
IDirect3D8
* (WINAPI* Direct3DCreate8Ptr)(UINT SDKVersion)=NULL;
hookDx8.GetOrgAddr (
&Direct3DCreate8Ptr);

d3d8temp
=Direct3DCreate8Ptr (SDKVersion); 


while((++nTimes)>1)
{
if(nTimes==2)
{
TCHAR szGamePath[
256]={0};
GetGamePath (szGamePath,
sizeof(szGamePath));
TCHAR szSettingFile[
256]={0};
wsprintf(szSettingFile,TEXT(
"%s\\userdata\\systemsettings.ini"),szGamePath);

if(::GetPrivateProfileInt (TEXT("Video"),TEXT("FullScreen"),0,szSettingFile))break;

}
NewIDirect3D8
* d3d8=new NewIDirect3D8(d3d8temp);

d3d8temp
=(IDirect3D8*)d3d8;

hookDx8.UnHook ();


break;
}
return d3d8temp;
}


HRESULT NewIDirect3D8::CreateDevice(UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,
DWORD BehaviorFlags,D3DPRESENT_PARAMETERS
* pPresentationParameters,
IDirect3DDevice8
** ppReturnedDeviceInterface)
{

HRESULT hr
=0;
hGameWnd
=hFocusWindow;
game.hGWnd
=hFocusWindow;


lpD3D
->CreateDevice(Adapter,DeviceType,hFocusWindow,BehaviorFlags,pPresentationParameters,&lpD3DD8bak); 



lpDevice
=new NewD3Device8(lpD3DD8bak);

/////////////////////////////Init Data/////////////////////////
if(game.OrgWndProc==0)
{
game.OrgWndProc
=::GetWindowLong (game.hGWnd ,GWL_WNDPROC );
if(game.OrgWndProc)
{
::SetWindowLong (game.hGWnd ,GWL_WNDPROC ,(LONG)
&FilterWndProc);



game.HookOpenResFunc (
1);

}

///////////////////////////////////////////////////////////////

*ppReturnedDeviceInterface = (IDirect3DDevice8*)lpDevice ;//替换 

return hr;

}




LRESULT CALLBACK FilterWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

if(game.CEGUIWndProc (hWnd,message,wParam,lParam))
return ::CallWindowProc ((WNDPROC)game.OrgWndProc,hWnd,message,wParam,lParam);
else
return 1;

}


HRESULT NewD3Device8::EndScene(
void)
{
game.MyGuiRender (); 
return dxDevice->EndScene();
}

 

posted on 2010-10-11 14:59  °ι 、曲 终  阅读(1302)  评论(1编辑  收藏  举报