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

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

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

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

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

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

下面这对对话在研究使用directdraw的游戏汉化时可能能用上。: B& T5 c) _. V" ~

& P1 T! i' O9 b* U原文
% j6 ^7 @% H6 r, w4 R9 f1 whttp://www.qqgb.com/Program/VC/VCJQ/Program_177879.html    - e* g, ~8 c" n! [; i
" f4 g' R$ H7 ]" Y# A: s
directdraw主表面显示文字问题 前提:已经Hook了ddraw.dll的几个关键API(包括接口的虚函数表),成功获取到了主表面。 ' e6 }0 I$ ^+ v- [( k
问题:向主表面的HDC TextOut后,文字是显示出来了,但都保持在屏幕的最顶层,其它窗口经过时也会显示文字。 3 O- S: H, g, }# t  `
为什么没有附在原窗口(用来显示主表面的)中呢? 第1个回答- w. G, y+ b5 S
居然还有这种事?HDC是ddraw窗口的DC吗?一个DC绘制的图形不是分离的对象,不可能被拆成两部分显示。后台表面也要同时hook绘制。 & E% A+ n7 u  A& D
--------------------------------------------------------------------------------
5 Y% s- F( [& z* V第2个回答
6 Z! d3 E3 R$ Q9 A1 R8 FHDC 是主表面实例指针-> GetDC()的,不是窗口的HDC。后台表面GetDC()失败,应该不是真正的后台,它不是用Flip进行显示的,而是主表面用Blt绘制另外一个非主表面。 , e' q5 K( [5 z# B
--------------------------------------------------------------------------------2 h+ S9 ^/ ?6 ?( T& w" q0 O  {$ e
第3个回答% O4 X$ l4 D% S! E# u; _
窗口界面的DDraw程序肯定不可能使用Flip了。 1 H. A  x) r0 n9 Q
主表面上绘制东西出界是常有的事情,首先要设置Clipper,而且在绘制的时候还要自己获取窗口坐标进行坐标变换,这样才能保证绘制在窗口上。
$ f1 p. L+ B! [/ C--------------------------------------------------------------------------------3 B0 N. _' |9 Z
第4个回答6 c; a* l# {9 l5 u, |2 S
我是想在第3方的视频播放器中显示文字,已经Hook了DDraw.dll,得到了主表面实例指针lpddsPrimary,此时主表面已经设置过了Clipper, " a7 p+ d; j$ v4 i+ t. @7 Z% Q" H
我只是lpddsPrimary-> GetDC(),然后Textout,出现显示的文字和画面分离的情况,文字显示的位置正确,但保持在屏幕的最上端,当有其它窗口   Y/ [! V# e/ ~( E# K7 e) U/ a
经过时也会显示文字。难道HDC也要设置Clipper,不会吧,真不知道怎么解决?! : {& y" h6 c/ y* l
另外是不是可以附加个覆盖页面(overlay),用来显示文字;但覆盖页面GetDC会失败,不能Textout,怎样才能在覆盖页面上显示文字?!
* n" S- p0 i0 v, C1 d--------------------------------------------------------------------------------
1 n1 M/ D1 I; d5 |第5个回答
6 x4 r% z$ h! K1 N, H( Z  h  V我也做过这事,,我的方法是注入一个dll,枚举它当前程序里所有的surface,然后分别往枚举出来的surface上textout,看哪个能用,效果最好
8 `2 ?$ u; b- R
+ A1 |; a+ P: F4 OC/C++ code# V1 E$ B0 V( z# x
--------------------------------------------------------------------------------
$ u4 H4 h" K5 \9 h/ c( a. I+ C5 s& zLPDIRECTDRAWSURFACE7 lpDDSPrimary;//主surface. F; ~# {8 ]" \9 @
LPDIRECTDRAWSURFACE7  lpDDS[4];//用来保存枚举出的surface6 `% a! d8 z# n0 p5 A
DWORD lpDDAddr = 0x00160e50;//lpDD的地址,通过调试很容易得到. M7 Q. f5 H3 E3 A: s5 w  w- [
LPDIRECTDRAW7 lpDD;
9 s- Z+ @# |# |DDSURFACEDESC2 ddsd;" e, N) T, A' ?0 F2 w) p9 T+ K

6 }! Q: R7 D5 sint si=0;//surface计数
1 i: E1 F* J7 N" u0 e$ n# ?2 `$ [DDSCAPS2 ddscaps ;6 c* D& n, f5 y* E
HRESULT WINAPI _surfaceEnumCallback_GetPrimary( LPDIRECTDRAWSURFACE7 lpDDSurface, LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID /*lpContext*/ ) {
- e# M; V# K" ~" {0 b- q    lpDDS[si] = lpDDSurface;- B' N9 j$ R& A7 ^/ I4 P
    si++;
2 g/ n9 o  n8 A& M    wsprintf(buff2, "surface:%8x, width=%d, height=%d, buffCount:%d\n",  J5 ?1 D8 ~8 ]! Y* u  f
        lpDDSurface, lpDDSurfaceDesc->dwWidth," y$ S: o+ `! k3 \7 ~/ p$ g
        lpDDSurfaceDesc->dwHeight,lpDDSurfaceDesc->dwBackBufferCount);
1 l) i0 g) [+ [- M. j+ o) `5 a    mout(buff2);6 q" R8 @' i# q4 L% N
    if( lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE ) { //Primary6 q+ s. {8 R! _4 B8 n$ W1 y
        lpDDSPrimary = lpDDSurface;7 n! K( q3 S6 |* S' P  s
        wsprintf(buff2, "primary surface: %8x\n", lpDDSurface);
; f! y% R6 ~5 A6 J% P        mout(buff2);/ e8 o; @. `! ^( H, P
    //    lpDDSurface->GetSurfaceDesc(&ddsd);" E; U. b; a# h* \) M+ D. m" m
    //  return DDENUMRET_CANCEL;" G  n9 w0 j8 \  c( |8 y9 @
    }
: n, S( j" m# B( N! N! k    //lpDDSurface->Release();
4 S, _, k$ S( U3 q3 S! J% t( T    return DDENUMRET_OK;$ C- ^3 a0 u5 L, O; v
}* P* @3 g# c  J
//以上是回调函数,下面是枚举! z" k7 R  k! `4 r+ Z; E+ V
// Get lpDD
5 L( V, [& N( k+ VDWORD addr=0x00385b2c;
0 Y9 e8 E6 V& s9 A% CVirtualProtect( ( void * ) addr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect );
4 [. m4 U; c) ?, N- OlpDDAddr=  *((DWORD*)addr);0 ]/ W& d  K1 O) Y. ^
lpDD = (struct IDirectDraw7 *)lpDDAddr;) s4 q  h$ I; j2 G/ u9 z! r. @

3 x- C8 h) |- b3 L; K// Enum Surface
  K2 m. O4 P5 J5 P2 M$ z, a+ E! Dmout("now start to enum:\n");
' l# q0 w) O" M  k8 jlpDD->EnumSurfaces( DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL, NULL, NULL, _surfaceEnumCallback_GetPrimary );7 h" `$ F4 l/ @, E8 [( k
for(int i=0;i<4;i++){2 a2 @7 V" u5 t1 y- ^" t
    wsprintf(buff2, "found surface[%d]: %8x\n", i, lpDDS);2 h. \. K; B5 ?$ U3 W2 Q, j
    mout(buff2);
( N0 L$ Q+ h  J0 h: f, N6 J}
: S, F7 E; a0 X0 ~
$ ^" T7 [5 F$ t; r) a) h$ R1 T
3 z) |$ H( H* ^! d9 G) T* G--------------------------------------------------------------------------------, I* j$ O0 H' v9 P5 y' {. i
第6个回答
9 a% n2 O1 q3 @, _* ]帮顶 + I/ w$ p- w5 a1 `" D* O
--------------------------------------------------------------------------------
9 W/ A4 i/ G6 W9 S; u0 f8 v第7个回答
/ t" M: w% R5 Z$ K在它的backBuffer绘制试试。
% z! s4 x/ q  b: m--------------------------------------------------------------------------------, X9 }- P  d# L2 ~0 |8 a! p" a
第8个回答
1 ?4 b1 y2 o/ A" t# E# y9 W/ ^backBuffer 无法GetDC(),就无法TextOut - R2 [: e# L: t6 A
--------------------------------------------------------------------------------( c, A8 u: G  @! U6 o. c6 a; S
第9个回答
' K# `$ `2 V5 O* q% ^backBuffer怎么会无法GetDC呢?那那个程序本身是怎么往上绘东西的啊。你看看是不是其它地方错了。
3 Q- Z% [3 O7 v% F--------------------------------------------------------------------------------
8 k+ e* h& M5 T) \. ?% H第10个回答
2 s, V9 [, y& E/ F* O+ i不会有错,那个程序是解码MP4视频流数据后,用ddraw加以显示,程序本身用不到GetDC,我用是为了显示文字。
/ n" y' P5 r+ t+ P6 u8 o/ K# @% T--------------------------------------------------------------------------------: `- P, A" [1 [# P
第11个回答
- y  _4 @9 T) I4 h那程序要往上面绘东西,Blt总得支持吧? 2 Y" t. C! a( l/ J
你自己建一个Surface,GetDC后TextOut你的文字,然后Blt到那个BackBuffer上去。 1 `& [7 E* k7 i/ r  t4 A( h
--------------------------------------------------------------------------------
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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