自己研究了半年了,怎么在一个全屏的DirectX游戏窗口/界面中绘制一个图形或文字

自己研究了半年了,如何在一个全屏的DirectX游戏窗口/界面中绘制一个图形或文字?
自己研究了半年了,如何在一个全屏的DirectX游戏窗口/界面中绘制一个图形或文字?

窗口模式的DirectX游戏窗口/界面,用GDI重复绘制就可以了.
问题是全屏模式的DirectX游戏窗口/界面下就不行。

有些绘制了,会闪烁。大部分游戏还是绘制不了。

大家帮帮忙吧

------解决方案--------------------
http://www.gamedev.net/community/forums/topic.asp?topic_id=359794
------解决方案--------------------
用DX的程序为啥要用GDI呢?我就纳闷了.
全屏模式的D3D和DDraw和窗口模式机制是不一样的,你用GDI画完之后再Present肯定是要被盖上的,D3D是往后被缓冲里面画,GDI直接往主缓冲上画,根本就是不兼容,原理就不一样怎么能兼容呢!

------解决方案--------------------
最好是在gamedev.net发帖讨论,比这里快多啦
------解决方案--------------------
探讨
引用:
用DX的程序为啥要用GDI呢?我就纳闷了.
全屏模式的D3D和DDraw和窗口模式机制是不一样的,你用GDI画完之后再Present肯定是要被盖上的,D3D是往后被缓冲里面画,GDI直接往主缓冲上画,根本就是不兼容,原理就不一样怎么能兼容呢!


所以我就问该怎么绘制啊? 能给我说说么?

------解决方案--------------------
除非那个程序给你预留出类似 GetD3DDevice() 或者 GetD3DBackBuffer() 这种接口,否则就没办法.
要不你就学习汇编,然后在汇编模式下调试人家的程序,通过分析得到它接口指针的地址,但是这种方法没有通用性,每一个程序保存的D3DDevice的接口地址都是不同的,也就是每来一个程序你都需要重新进行汇编调试一次,所以说这根本没有意义.
不论是谁写的程序都不愿意被hook
------解决方案--------------------
探讨
引用:
http://www.gamedev.net/community/forums/topic.asp?topic_id=359794


看来一下,我想在问一下
有简单一点的吗?就是想获取目标进程所使用的 IDirect3D9 或者 IDirect3DDevice9

------解决方案--------------------
我给的贴子已经说得够简单明了的了,如果你看不明白,那说明你需要学习很多东东了
------解决方案--------------------
如果你用的是DX9的话,那么文字方面完全不需要使用GDI,你可以使用DX9中的 LPD3DXFONT ,来显示2D和3D文字,并且他们都完全支持中文(可以显示3D的中文)。。。。
------解决方案--------------------
uping
------解决方案--------------------
没有别的方法
------解决方案--------------------
帮顶··
------解决方案--------------------
正好我写过 d3d 的 HOOK,给你参考一下

首先你需要在你的代码里面重新初始化 d3d,我就不逐个解释了,你可以参考 d3d 的相关书籍,我只说重点

// 初始化 d3d8
void InitD3d8()
{
// 创建D3D对象
if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
return;

// 获取当前的显示模式
D3DDISPLAYMODE d3ddm;
if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
return;

D3DPRESENT_PARAMETERS d3dpp; 
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; // 窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 设置交换模式
d3dpp.BackBufferFormat = d3ddm.Format; // 设置背景缓冲区格式为当前左面格式
d3dpp.EnableAutoDepthStencil = TRUE; // 打开深度缓冲zbuffer
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 深度缓冲格式

// 创建D3D设备
// 第一个参数:使用默认的显卡适配器
// 第二个参数:请求使用硬件抽象层(HAL)
// 第三个参数:窗口句柄
// 第四个参数:使用软件处理顶点
// 第五个参数:创建的参数
// 第六个参数:创建的D3D设备指针
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, 
D3DDEVTYPE_HAL, 
g_hGameHandle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, 
&g_pd3dDevice ) ) )
{
return;
}
}

// 销毁 D3d8
void DestroyD3d8()
{
// 释放地点缓冲区
if( g_pVB != NULL )
g_pVB->Release();

// 释放D3D设备
if( g_pd3dDevice != NULL) 
g_pd3dDevice->Release();