前提:已经Hook了ddraw.dll的几个关键API(包括接口的虚函数表),成功获取到了主表面。
问题:向主表面的HDC TextOut后,文字是显示出来了,但都保持在屏幕的最顶层,其它窗口经过时也会显示文字。
为什么没有附在原窗口(用来显示主表面的)中呢?
问题:向主表面的HDC TextOut后,文字是显示出来了,但都保持在屏幕的最顶层,其它窗口经过时也会显示文字。
为什么没有附在原窗口(用来显示主表面的)中呢?
解决方案 »
- COleDateTime类是不是摆设?
- 关于dmusici.h的问题
- 如何实现像我的电脑中地址栏那样把系统的树结构显示到下拉列表中呢?
- Http问题!
- 一个新手的问题“如何创建一个视图并显示(就像新建一个工程时默认创建的视图一样)”
- 为什么我的gethostname()函数不起作用?(请多多指教)
- 求教!急!关于贝塞尔曲线的!请赐教!100分!
- regsvr32如何判断一个dll的PE文件是不是一个COM组件?
- 为什么即时提示的类成员列表会忽然消失了?是不是创天中文版的bug???
- 咨询下薪资
- 我想创建一个静态链接库,里面调用其它的dll,要怎么做呢?
- RECT几个参数相当于一个窗口的那个位置,是不是四条边的结点?
我只是lpddsPrimary->GetDC(),然后Textout,出现显示的文字和画面分离的情况,文字显示的位置正确,但保持在屏幕的最上端,当有其它窗口
经过时也会显示文字。难道HDC也要设置Clipper,不会吧,真不知道怎么解决?!另外是不是可以附加个覆盖页面(overlay),用来显示文字;但覆盖页面GetDC会失败,不能Textout,怎样才能在覆盖页面上显示文字?!
LPDIRECTDRAWSURFACE7 lpDDSPrimary;//主surface
LPDIRECTDRAWSURFACE7 lpDDS[4];//用来保存枚举出的surface
DWORD lpDDAddr = 0x00160e50;//lpDD的地址,通过调试很容易得到
LPDIRECTDRAW7 lpDD;
DDSURFACEDESC2 ddsd;int si=0;//surface计数
DDSCAPS2 ddscaps ;
HRESULT WINAPI _surfaceEnumCallback_GetPrimary( LPDIRECTDRAWSURFACE7 lpDDSurface, LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID /*lpContext*/ ) {
lpDDS[si] = lpDDSurface;
si++;
wsprintf(buff2, "surface:%8x, width=%d, height=%d, buffCount:%d\n",
lpDDSurface, lpDDSurfaceDesc->dwWidth,
lpDDSurfaceDesc->dwHeight,lpDDSurfaceDesc->dwBackBufferCount);
mout(buff2);
if( lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE ) { //Primary
lpDDSPrimary = lpDDSurface;
wsprintf(buff2, "primary surface: %8x\n", lpDDSurface);
mout(buff2);
// lpDDSurface->GetSurfaceDesc(&ddsd);
// return DDENUMRET_CANCEL;
}
//lpDDSurface->Release();
return DDENUMRET_OK;
}
//以上是回调函数,下面是枚举
// Get lpDD
DWORD addr=0x00385b2c;
VirtualProtect( ( void * ) addr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect );
lpDDAddr= *((DWORD*)addr);
lpDD = (struct IDirectDraw7 *)lpDDAddr;// Enum Surface
mout("now start to enum:\n");
lpDD->EnumSurfaces( DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL, NULL, NULL, _surfaceEnumCallback_GetPrimary );
for(int i=0;i<4;i++){
wsprintf(buff2, "found surface[%d]: %8x\n", i, lpDDS[i]);
mout(buff2);
}