设为首页收藏本站官方微博

【图像识别汉化研究】directdraw主表面显示文字疑难

[复制链接]
查看: 2397|回复: 0
打印 上一主题 下一主题

【图像识别汉化研究】directdraw主表面显示文字疑难

跳转到指定楼层
楼主
发表于 2009-5-30 09:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【图像识别汉化研究】directdraw主表面显示文字疑难

下面这对对话在研究使用directdraw的游戏汉化时可能能用上。
8 j2 A8 U1 V" |7 N5 x1 J  o, J+ q- J
5 `# v% m5 b2 }' r% J% R. I9 s8 q原文& w0 d1 `3 e9 n0 v
http://www.qqgb.com/Program/VC/VCJQ/Program_177879.html   
* P- G% ~$ O) A5 V% j+ T+ L& k% j
) r) r9 k* A4 l* wdirectdraw主表面显示文字问题 前提:已经Hook了ddraw.dll的几个关键API(包括接口的虚函数表),成功获取到了主表面。 1 ?- K! z- k/ O& J8 f
问题:向主表面的HDC TextOut后,文字是显示出来了,但都保持在屏幕的最顶层,其它窗口经过时也会显示文字。
1 P( h# W+ [, `4 z' `7 i/ N为什么没有附在原窗口(用来显示主表面的)中呢? 第1个回答
+ {) }& l" [0 f9 D  W; }+ _7 C居然还有这种事?HDC是ddraw窗口的DC吗?一个DC绘制的图形不是分离的对象,不可能被拆成两部分显示。后台表面也要同时hook绘制。 6 o3 [, c, s$ l* r( |
--------------------------------------------------------------------------------
" b$ m+ W0 g" v$ |+ q第2个回答
' h$ R' W  `1 ]3 X3 YHDC 是主表面实例指针-> GetDC()的,不是窗口的HDC。后台表面GetDC()失败,应该不是真正的后台,它不是用Flip进行显示的,而是主表面用Blt绘制另外一个非主表面。
+ J- G4 q+ N% y- w% j3 v) m  Z--------------------------------------------------------------------------------5 L; j( L4 n# G% _& C1 }
第3个回答: p1 P/ S' ^. ?4 O! ?1 c$ b$ f
窗口界面的DDraw程序肯定不可能使用Flip了。
9 O) v" x# o5 @8 b4 W$ t主表面上绘制东西出界是常有的事情,首先要设置Clipper,而且在绘制的时候还要自己获取窗口坐标进行坐标变换,这样才能保证绘制在窗口上。 7 v* [! t; g, M2 @
--------------------------------------------------------------------------------
  @0 f6 c2 r8 \$ k8 O* |第4个回答
! K' f: S. n2 C* ?7 Y8 `我是想在第3方的视频播放器中显示文字,已经Hook了DDraw.dll,得到了主表面实例指针lpddsPrimary,此时主表面已经设置过了Clipper,
3 D, q% F. l2 j6 z% k8 Z我只是lpddsPrimary-> GetDC(),然后Textout,出现显示的文字和画面分离的情况,文字显示的位置正确,但保持在屏幕的最上端,当有其它窗口
& F3 l7 E$ @5 _4 B5 T经过时也会显示文字。难道HDC也要设置Clipper,不会吧,真不知道怎么解决?!
6 A: u! `0 v" m2 B3 G4 O$ w另外是不是可以附加个覆盖页面(overlay),用来显示文字;但覆盖页面GetDC会失败,不能Textout,怎样才能在覆盖页面上显示文字?!
/ h0 B* Q4 t1 v--------------------------------------------------------------------------------0 d+ Y' O$ z4 ]8 w& f
第5个回答
, Y* |- _. q2 h- k& c4 A我也做过这事,,我的方法是注入一个dll,枚举它当前程序里所有的surface,然后分别往枚举出来的surface上textout,看哪个能用,效果最好
, O7 i2 `. \3 B4 k9 z0 X0 F( M' f. V2 ^& B) t0 J7 g" M2 Z4 }+ x
C/C++ code
4 Q  N3 V: S; y- ?3 ^3 f; |" |" h  _--------------------------------------------------------------------------------
( t% O  D8 a. s( S, h1 ALPDIRECTDRAWSURFACE7 lpDDSPrimary;//主surface
+ B* c1 a$ j2 V/ p6 l+ FLPDIRECTDRAWSURFACE7  lpDDS[4];//用来保存枚举出的surface
. r0 z& E+ U! d# h9 X) N$ YDWORD lpDDAddr = 0x00160e50;//lpDD的地址,通过调试很容易得到
/ Y; h- K, v+ d# `4 SLPDIRECTDRAW7 lpDD;
$ g3 x3 Q1 }. _( h6 bDDSURFACEDESC2 ddsd;* Z* s& \- r0 f
7 ~) k- V4 ^6 z# }; Y& R
int si=0;//surface计数3 ~9 t  [$ O8 j0 W2 S+ B7 `- {5 c
DDSCAPS2 ddscaps ;' R- L6 Q6 [. I" t. [
HRESULT WINAPI _surfaceEnumCallback_GetPrimary( LPDIRECTDRAWSURFACE7 lpDDSurface, LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID /*lpContext*/ ) {
# n  {/ d+ t( S: I    lpDDS[si] = lpDDSurface;0 O) W# Y& @4 y; ^$ d
    si++;4 q) B2 Z# ?8 P; o
    wsprintf(buff2, "surface:%8x, width=%d, height=%d, buffCount:%d\n",+ m8 T8 g: @5 q8 i
        lpDDSurface, lpDDSurfaceDesc->dwWidth,
" x/ \) W/ y; n8 {  e        lpDDSurfaceDesc->dwHeight,lpDDSurfaceDesc->dwBackBufferCount);: g$ `& q" {7 @" x1 e0 y$ }
    mout(buff2);
/ X, c5 c4 B3 @% e    if( lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE ) { //Primary9 \: I3 q1 M) e3 d% L& O  ]
        lpDDSPrimary = lpDDSurface;
" W- i% t& w' X: b4 [$ r        wsprintf(buff2, "primary surface: %8x\n", lpDDSurface);4 R5 d6 V3 V- R+ E# W( V9 K
        mout(buff2);
( i* k5 y- e+ j1 n  R. g  |    //    lpDDSurface->GetSurfaceDesc(&ddsd);
) t) d" c6 V' n/ p    //  return DDENUMRET_CANCEL;- k+ g* [% E$ b$ \, Y
    } $ k3 h: V. G: {
    //lpDDSurface->Release();
' w- e! k. S4 {0 S* |    return DDENUMRET_OK;+ w: l5 `5 c5 B! h7 u8 _7 F: a
}- Q  b: T+ m, a. r$ }
//以上是回调函数,下面是枚举  \$ {6 v( S+ J  ^
// Get lpDD
( S# G0 Z, f3 |  uDWORD addr=0x00385b2c;
  F: {0 f! S1 C" P+ K  rVirtualProtect( ( void * ) addr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect );
& z6 `9 S% l7 t( e5 U, @( }* }lpDDAddr=  *((DWORD*)addr);
9 w5 j+ N( \0 ^8 Y* v2 r, F; tlpDD = (struct IDirectDraw7 *)lpDDAddr;# D% S! n5 C5 |2 w: P
3 a: `& A5 I1 n3 ?3 c+ U
// Enum Surface
+ o- E- r2 ^$ F) c" B% B' dmout("now start to enum:\n");! V" G: F& j( X+ k+ ?
lpDD->EnumSurfaces( DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL, NULL, NULL, _surfaceEnumCallback_GetPrimary );
! s) w5 l$ N9 {+ i; nfor(int i=0;i<4;i++){% G) c5 y! ~( R
    wsprintf(buff2, "found surface[%d]: %8x\n", i, lpDDS);% r6 i# A0 @( G* h" f/ Y
    mout(buff2);/ [9 m# |- z7 {( l6 l
}
, |5 y1 ?5 ]8 G; F. m/ R" t* J' M! F+ H0 ~$ S  c

/ ]9 J! }6 j) `. P--------------------------------------------------------------------------------" O* v  @7 ?/ E+ k2 r: Y8 Y
第6个回答
; F; o' ]9 _  F- n' X, T帮顶
$ O7 s0 ?7 Q; \7 B* |' Q: d# X--------------------------------------------------------------------------------
  P  C( P' T0 P第7个回答
1 @% ?5 k% }; X1 e在它的backBuffer绘制试试。
6 `, g" h- c6 q' Y0 k/ g--------------------------------------------------------------------------------5 i: K0 _2 u& Y
第8个回答
4 h$ X" G- H7 S: e+ p6 \3 bbackBuffer 无法GetDC(),就无法TextOut 9 g# }4 S2 @0 |, X
--------------------------------------------------------------------------------- ~6 S9 i( i/ o5 f
第9个回答0 \3 R; R+ d6 v) |( I/ Y+ z
backBuffer怎么会无法GetDC呢?那那个程序本身是怎么往上绘东西的啊。你看看是不是其它地方错了。
3 i9 j$ P. Z5 m+ {# z1 G  e; \--------------------------------------------------------------------------------
* z; a( @7 ]; Z第10个回答4 i' ]3 y3 @4 H: y" @7 B
不会有错,那个程序是解码MP4视频流数据后,用ddraw加以显示,程序本身用不到GetDC,我用是为了显示文字。
3 C( l, A, f% k0 v2 e--------------------------------------------------------------------------------3 y7 x3 C$ x% B
第11个回答
: [- o6 x1 d: D8 m5 [+ D那程序要往上面绘东西,Blt总得支持吧? 0 o6 B% {. d# b2 w% K+ f6 d5 V/ Q
你自己建一个Surface,GetDC后TextOut你的文字,然后Blt到那个BackBuffer上去。 ) M9 H1 _5 l) w$ W, d9 a" t
--------------------------------------------------------------------------------
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表