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

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

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

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

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

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

下面这对对话在研究使用directdraw的游戏汉化时可能能用上。" s) E5 n! \/ n7 K4 g5 s
8 n8 \. l( Z! b8 |3 }% l# y
原文* V( x$ C* z& k
http://www.qqgb.com/Program/VC/VCJQ/Program_177879.html   
' I, u! h2 N# c% M* _) X
! ?1 A; U1 z4 w9 U2 o" p- [directdraw主表面显示文字问题 前提:已经Hook了ddraw.dll的几个关键API(包括接口的虚函数表),成功获取到了主表面。
0 B2 F& v2 E" q4 {# _1 j问题:向主表面的HDC TextOut后,文字是显示出来了,但都保持在屏幕的最顶层,其它窗口经过时也会显示文字。 ; r! m3 _( h& n( p& o0 E' u
为什么没有附在原窗口(用来显示主表面的)中呢? 第1个回答
2 v& O* P1 J, F5 h3 Q! `1 t居然还有这种事?HDC是ddraw窗口的DC吗?一个DC绘制的图形不是分离的对象,不可能被拆成两部分显示。后台表面也要同时hook绘制。
, `) v: {4 `4 j$ F1 L; \--------------------------------------------------------------------------------% i1 F7 k* t% P
第2个回答6 [  C3 E8 @" x+ O
HDC 是主表面实例指针-> GetDC()的,不是窗口的HDC。后台表面GetDC()失败,应该不是真正的后台,它不是用Flip进行显示的,而是主表面用Blt绘制另外一个非主表面。
7 F2 Z0 d. E: g6 X$ J/ [8 y' M0 [- u! q--------------------------------------------------------------------------------
+ k$ ~$ ~+ M2 o& z7 O3 G; S第3个回答6 c# L! e" V7 u  X6 O2 @
窗口界面的DDraw程序肯定不可能使用Flip了。
% N6 F& i/ T! H. p$ N5 Q主表面上绘制东西出界是常有的事情,首先要设置Clipper,而且在绘制的时候还要自己获取窗口坐标进行坐标变换,这样才能保证绘制在窗口上。
6 ]3 d0 u2 w* b2 v% Z--------------------------------------------------------------------------------
5 g- b/ x8 t; A; k; n  h* s第4个回答# `. d' ~: ]- x/ e4 j5 {* P
我是想在第3方的视频播放器中显示文字,已经Hook了DDraw.dll,得到了主表面实例指针lpddsPrimary,此时主表面已经设置过了Clipper,
' |$ ~2 x$ E; b+ E4 d, F7 ]我只是lpddsPrimary-> GetDC(),然后Textout,出现显示的文字和画面分离的情况,文字显示的位置正确,但保持在屏幕的最上端,当有其它窗口
8 G, c/ v, ?8 t8 f8 i经过时也会显示文字。难道HDC也要设置Clipper,不会吧,真不知道怎么解决?!
( j1 N  }5 \7 H. N. S0 Y另外是不是可以附加个覆盖页面(overlay),用来显示文字;但覆盖页面GetDC会失败,不能Textout,怎样才能在覆盖页面上显示文字?!
9 E6 N+ k. n9 Q( d' C  F--------------------------------------------------------------------------------/ i2 {) K; Y. `+ T
第5个回答
2 [6 F( T0 a3 F- V我也做过这事,,我的方法是注入一个dll,枚举它当前程序里所有的surface,然后分别往枚举出来的surface上textout,看哪个能用,效果最好 9 U1 m. U) O! W

& ?  n' B) H' WC/C++ code
. D% U7 u/ w1 I5 m' H9 U. a--------------------------------------------------------------------------------
  k& @$ j" I1 \LPDIRECTDRAWSURFACE7 lpDDSPrimary;//主surface4 S% a1 ~4 J8 [* l9 Q# n3 Z6 w
LPDIRECTDRAWSURFACE7  lpDDS[4];//用来保存枚举出的surface1 C4 @+ D% Z1 M9 S9 t4 z. D
DWORD lpDDAddr = 0x00160e50;//lpDD的地址,通过调试很容易得到; M# d1 J. w+ i, e8 n# h8 _7 I4 V
LPDIRECTDRAW7 lpDD;
% j2 a$ B$ e6 b9 }: R, A4 V4 GDDSURFACEDESC2 ddsd;
$ a5 I; W8 M* k" W$ M+ \: X
. A* a5 y) t) z- S7 B' c3 ]6 ^int si=0;//surface计数4 R+ Y& ]6 e1 U. `
DDSCAPS2 ddscaps ;5 c: ]4 G! T7 y8 M# S5 ~
HRESULT WINAPI _surfaceEnumCallback_GetPrimary( LPDIRECTDRAWSURFACE7 lpDDSurface, LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID /*lpContext*/ ) {' o, B' E/ t( Q7 G
    lpDDS[si] = lpDDSurface;4 B' E, D3 Q0 u4 \% H& K' x( E
    si++;, Y2 f% T" }6 d7 M
    wsprintf(buff2, "surface:%8x, width=%d, height=%d, buffCount:%d\n",
, o% ~. ^2 }: `0 f/ M        lpDDSurface, lpDDSurfaceDesc->dwWidth,
. j' c) ^3 w  b  V  I  H        lpDDSurfaceDesc->dwHeight,lpDDSurfaceDesc->dwBackBufferCount);  V4 s* u" Z! i: e' N3 Y
    mout(buff2);# r4 {9 _$ v% z3 C
    if( lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE ) { //Primary- {/ Y& i; v# H& j
        lpDDSPrimary = lpDDSurface;" o3 P+ W, R# o4 M  U! ?9 d
        wsprintf(buff2, "primary surface: %8x\n", lpDDSurface);
: A) {& W. |( i! g" D& d        mout(buff2);$ \5 ?$ _* t, K, n
    //    lpDDSurface->GetSurfaceDesc(&ddsd);) V1 Z9 d; k  ]- K
    //  return DDENUMRET_CANCEL;) `+ M- ?. N4 w/ j2 K+ O* c
    } 0 y# e; r( O5 w& f) U, k
    //lpDDSurface->Release();# C4 F0 j4 q: G% j) `' E1 H0 d
    return DDENUMRET_OK;
8 O0 h6 x( X- E) ?: y8 h}
4 E. F& D$ u, d) F2 S! _//以上是回调函数,下面是枚举* d5 l7 U5 h5 i% Q7 S
// Get lpDD, t- }, C8 M5 m/ I0 A6 d6 h/ F
DWORD addr=0x00385b2c;9 n4 T' v& f% H
VirtualProtect( ( void * ) addr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect );+ y; }! A) p7 r: K# J
lpDDAddr=  *((DWORD*)addr);. ~) I, V& _$ F5 ]6 r- T
lpDD = (struct IDirectDraw7 *)lpDDAddr;; [, f) O3 O5 N) W
8 a" z3 g- }0 k3 Y7 I3 ?! i6 Y
// Enum Surface3 W! z* t) \: V: P
mout("now start to enum:\n");& Q- O7 e* s) t0 Q2 |' p. o
lpDD->EnumSurfaces( DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL, NULL, NULL, _surfaceEnumCallback_GetPrimary );
  ~$ Q, l/ |: sfor(int i=0;i<4;i++){
. z% a# ^, [1 M# M0 f& k' f    wsprintf(buff2, "found surface[%d]: %8x\n", i, lpDDS);0 m* H' P& N0 @" G- I+ r
    mout(buff2);
) l2 g1 E  m, V5 C+ R5 d}4 F/ T2 }+ k7 k8 N2 h
1 p' [' n6 G! r% Z! M4 w3 T; C

. L% Z  u6 L- }, B) l--------------------------------------------------------------------------------
% A( Y" A' f  x8 n- H0 D. {+ ]第6个回答
& p0 t- \4 D1 {8 {# s- z$ b8 d% A# L帮顶 + P6 T- {" K( R! v" [+ c
--------------------------------------------------------------------------------) G( P( h' {: v1 k4 A3 K+ s
第7个回答
) ?# d4 U% M3 T在它的backBuffer绘制试试。
6 g( r" ^4 D) ~--------------------------------------------------------------------------------
( S6 x' Z/ Z- O- K) j第8个回答2 `; {9 u3 y6 |  G" S* r5 M
backBuffer 无法GetDC(),就无法TextOut
$ T* e, S" Z$ N9 @# v, i6 P$ }--------------------------------------------------------------------------------9 F/ h, Q! |8 t. v9 F
第9个回答
( c2 U0 {1 g* y8 |  ?backBuffer怎么会无法GetDC呢?那那个程序本身是怎么往上绘东西的啊。你看看是不是其它地方错了。
" _  Z9 O8 C7 r8 o5 S! z--------------------------------------------------------------------------------
  j. T$ O" s6 r" a6 ]第10个回答
' Q) s; M5 f, w- H, Q& _不会有错,那个程序是解码MP4视频流数据后,用ddraw加以显示,程序本身用不到GetDC,我用是为了显示文字。 ! J: ]) v) D+ k- u, |
--------------------------------------------------------------------------------) k0 S$ E: G, x: ^/ `5 P
第11个回答" m% |$ l' `4 Y
那程序要往上面绘东西,Blt总得支持吧? $ l7 K! ?- J. f# g# e/ P% U
你自己建一个Surface,GetDC后TextOut你的文字,然后Blt到那个BackBuffer上去。 9 f& t8 k7 d" d8 K. `
--------------------------------------------------------------------------------
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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