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

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

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

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

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

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

下面这对对话在研究使用directdraw的游戏汉化时可能能用上。
! J% [2 A! [& _) i, {8 X$ b. S
: B" m; O$ H9 D0 i4 X原文& H, ~1 [, t( `$ D
http://www.qqgb.com/Program/VC/VCJQ/Program_177879.html    1 {3 o4 u3 w/ F( F
1 h: {5 {- ]: }1 @; W9 D1 Q
directdraw主表面显示文字问题 前提:已经Hook了ddraw.dll的几个关键API(包括接口的虚函数表),成功获取到了主表面。 6 ^! f8 x; f' }( g3 K& _% g
问题:向主表面的HDC TextOut后,文字是显示出来了,但都保持在屏幕的最顶层,其它窗口经过时也会显示文字。
3 U: x6 P- W9 y5 O  ]# T% t为什么没有附在原窗口(用来显示主表面的)中呢? 第1个回答8 L' m% c8 D: U. A% V
居然还有这种事?HDC是ddraw窗口的DC吗?一个DC绘制的图形不是分离的对象,不可能被拆成两部分显示。后台表面也要同时hook绘制。 + o: D4 w. H. L  q0 H
--------------------------------------------------------------------------------
/ J" `( L0 N+ {2 a1 m- V+ P第2个回答% C8 N+ o- H( m+ N
HDC 是主表面实例指针-> GetDC()的,不是窗口的HDC。后台表面GetDC()失败,应该不是真正的后台,它不是用Flip进行显示的,而是主表面用Blt绘制另外一个非主表面。 3 i+ o% X, J; F# E7 K
--------------------------------------------------------------------------------
4 t" x/ T/ R$ K, ~- M第3个回答! z9 W. n/ n, H; H/ e. I1 P
窗口界面的DDraw程序肯定不可能使用Flip了。
! \$ b/ }& U1 U: A$ C. h2 y: w主表面上绘制东西出界是常有的事情,首先要设置Clipper,而且在绘制的时候还要自己获取窗口坐标进行坐标变换,这样才能保证绘制在窗口上。 + ]) \3 c" P; A- U! {
--------------------------------------------------------------------------------3 h/ d& F  k8 c  A" H6 G; D; y
第4个回答
6 F" N! [5 H  u# N5 }# \我是想在第3方的视频播放器中显示文字,已经Hook了DDraw.dll,得到了主表面实例指针lpddsPrimary,此时主表面已经设置过了Clipper,
  j2 c  b# `# g5 u6 Q& j6 `我只是lpddsPrimary-> GetDC(),然后Textout,出现显示的文字和画面分离的情况,文字显示的位置正确,但保持在屏幕的最上端,当有其它窗口 ; [: h6 G; @( E( {/ J# u: i( F
经过时也会显示文字。难道HDC也要设置Clipper,不会吧,真不知道怎么解决?! # U0 p$ X% f! B$ i
另外是不是可以附加个覆盖页面(overlay),用来显示文字;但覆盖页面GetDC会失败,不能Textout,怎样才能在覆盖页面上显示文字?!
5 k3 I: k+ D( O! u' Y+ Q3 D/ _  U( ^--------------------------------------------------------------------------------
; D% g5 E3 p" g0 T# J% W! `  G, r第5个回答  U- {7 B0 v/ g. h. z
我也做过这事,,我的方法是注入一个dll,枚举它当前程序里所有的surface,然后分别往枚举出来的surface上textout,看哪个能用,效果最好
4 C, d% H3 N- j8 p/ l
1 B% W. y$ W& M& D1 h, |C/C++ code  R+ Q5 c' b, P& t- o" R, h" _" |
--------------------------------------------------------------------------------6 S2 m/ I; ]) J; U
LPDIRECTDRAWSURFACE7 lpDDSPrimary;//主surface. Y% J. i* q& d5 o' P& ^1 A* h
LPDIRECTDRAWSURFACE7  lpDDS[4];//用来保存枚举出的surface* w1 i. J. V( o- i
DWORD lpDDAddr = 0x00160e50;//lpDD的地址,通过调试很容易得到; w: A( w+ s) h& ^, ?
LPDIRECTDRAW7 lpDD;0 w0 h3 D& n1 a) F7 v
DDSURFACEDESC2 ddsd;
- t6 I; P! F" ~! d9 B$ z# J, B) V2 ~, ^  j5 k5 U# c% x1 d
int si=0;//surface计数
) p9 p% o0 Z: n, h& @! {DDSCAPS2 ddscaps ;" J/ m( I! O) S
HRESULT WINAPI _surfaceEnumCallback_GetPrimary( LPDIRECTDRAWSURFACE7 lpDDSurface, LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID /*lpContext*/ ) {3 E0 @0 C& o; ]
    lpDDS[si] = lpDDSurface;
3 v1 G3 A; _0 B2 _$ @    si++;
, I7 w+ W. Y+ t    wsprintf(buff2, "surface:%8x, width=%d, height=%d, buffCount:%d\n",1 `4 Q1 L4 ?' E5 `$ a6 t
        lpDDSurface, lpDDSurfaceDesc->dwWidth,
4 V( F% r1 A  b' i8 ^        lpDDSurfaceDesc->dwHeight,lpDDSurfaceDesc->dwBackBufferCount);
. p2 u3 |  m: s; u$ T    mout(buff2);
9 P( i3 U8 t$ f6 S% {. I' i# p    if( lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE ) { //Primary4 J1 r4 w  H# Z( Y
        lpDDSPrimary = lpDDSurface;
, g* l& o# {- v: d, l! g        wsprintf(buff2, "primary surface: %8x\n", lpDDSurface);: P( e. Y, u' u7 ?$ K
        mout(buff2);, D3 l5 _. ?+ m7 r" Q7 ~
    //    lpDDSurface->GetSurfaceDesc(&ddsd);1 n( m" \" u/ K# a3 X/ G, E
    //  return DDENUMRET_CANCEL;
1 [0 C! P  s; {. _+ W2 }    } 0 J* y# k5 H/ A8 H) O
    //lpDDSurface->Release();- c; ^5 P) \0 Q* F* @  M6 B
    return DDENUMRET_OK;$ A( Z1 @- R0 N! g
}+ K4 N1 _9 S: X$ b; B( k
//以上是回调函数,下面是枚举
' |/ d0 F) m- q// Get lpDD) e& P, a: t5 T0 f, C
DWORD addr=0x00385b2c;: r9 G( U+ k* q/ h7 D1 v& b  j
VirtualProtect( ( void * ) addr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect );
  d+ @6 s/ ~  z7 o$ r. |lpDDAddr=  *((DWORD*)addr);
# b8 c3 c1 ^  t- plpDD = (struct IDirectDraw7 *)lpDDAddr;
8 D- N1 a0 S5 X2 w7 \9 G% O6 q1 {
2 W4 \1 n7 C3 R1 e1 [1 `6 ~// Enum Surface4 x- [! y2 Y5 [+ w
mout("now start to enum:\n");
7 l( u" u4 x& g5 W- zlpDD->EnumSurfaces( DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL, NULL, NULL, _surfaceEnumCallback_GetPrimary );, C( L8 p: n) ]; W+ h8 h
for(int i=0;i<4;i++){4 ]& o1 Z# a* G9 N0 |5 O3 x7 y
    wsprintf(buff2, "found surface[%d]: %8x\n", i, lpDDS);9 P$ f, U" M7 F  z7 C7 a, L; g
    mout(buff2);
- B+ L+ e% B* @0 v3 N}$ E4 U1 e; {# J
1 V% n+ L, }" N. o+ ]+ R
- f3 C9 {% h6 a( K. Q4 w! n) L
--------------------------------------------------------------------------------
" E& }0 t" ^6 [0 t/ T6 A6 V第6个回答
% c& k" e8 j( j0 z! n帮顶
7 n. ^* s; j( {& H--------------------------------------------------------------------------------0 s( |3 [; ]( I6 \+ `! w0 c
第7个回答
$ q% ~; S; K4 \6 m+ o& C. J在它的backBuffer绘制试试。 7 _4 H8 h6 T% v" u6 A% Y) A
--------------------------------------------------------------------------------4 Z$ }& E6 G. I( a
第8个回答
6 Q0 w9 V- l% n+ f5 abackBuffer 无法GetDC(),就无法TextOut 9 Y0 n$ v6 p  j
--------------------------------------------------------------------------------
" I" I7 ?9 ~: g3 a3 P  p5 v第9个回答
" {- G. ~4 M2 G  a6 y/ ObackBuffer怎么会无法GetDC呢?那那个程序本身是怎么往上绘东西的啊。你看看是不是其它地方错了。
) Q* z" F' {8 }* x" f1 x--------------------------------------------------------------------------------
' p$ W$ k& Q: t* o; a第10个回答
& L# _& x( B3 @! w, f不会有错,那个程序是解码MP4视频流数据后,用ddraw加以显示,程序本身用不到GetDC,我用是为了显示文字。 9 m" g3 E) {8 l! y1 u3 o# Q3 [
--------------------------------------------------------------------------------
1 w+ r& u  @5 k) |( k# l. p: ~第11个回答7 T1 T$ k  q0 F  }5 A; Y
那程序要往上面绘东西,Blt总得支持吧?
! l( q4 s+ @  u  F1 K1 O2 s6 ^你自己建一个Surface,GetDC后TextOut你的文字,然后Blt到那个BackBuffer上去。 " |! m& A$ q3 t! x
--------------------------------------------------------------------------------
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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