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

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

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

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

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

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

下面这对对话在研究使用directdraw的游戏汉化时可能能用上。
' G: @) x. R( Y& I; A
- P9 l! T$ S: X$ [3 d; p& ]  `原文8 Z6 F/ n5 R4 l2 H- a
http://www.qqgb.com/Program/VC/VCJQ/Program_177879.html    ( x5 K+ D& J5 `7 A$ I, d

" a" a0 `% ]1 Ndirectdraw主表面显示文字问题 前提:已经Hook了ddraw.dll的几个关键API(包括接口的虚函数表),成功获取到了主表面。 + c: u( @$ \' G% [" S( Q; l
问题:向主表面的HDC TextOut后,文字是显示出来了,但都保持在屏幕的最顶层,其它窗口经过时也会显示文字。
  h) d7 t3 u3 t" S9 F$ o为什么没有附在原窗口(用来显示主表面的)中呢? 第1个回答
8 F* B) Z+ U0 b3 S; D. H居然还有这种事?HDC是ddraw窗口的DC吗?一个DC绘制的图形不是分离的对象,不可能被拆成两部分显示。后台表面也要同时hook绘制。 ) P  G: V' ~# S$ C5 b( O
--------------------------------------------------------------------------------
! g8 V  A3 M. F8 I第2个回答
  d- `- m3 b/ |0 E  bHDC 是主表面实例指针-> GetDC()的,不是窗口的HDC。后台表面GetDC()失败,应该不是真正的后台,它不是用Flip进行显示的,而是主表面用Blt绘制另外一个非主表面。
% A- s+ c2 K2 F& ~--------------------------------------------------------------------------------
- o: A! D& t' U1 }, Z第3个回答
" _; Y" J% T8 V- n窗口界面的DDraw程序肯定不可能使用Flip了。 3 H3 c2 v* W/ ?7 j. z; f5 j
主表面上绘制东西出界是常有的事情,首先要设置Clipper,而且在绘制的时候还要自己获取窗口坐标进行坐标变换,这样才能保证绘制在窗口上。 - I6 X: x6 ?" x* U
--------------------------------------------------------------------------------' Q$ c; G7 W8 v6 r
第4个回答
0 J; q& C% `1 N: {我是想在第3方的视频播放器中显示文字,已经Hook了DDraw.dll,得到了主表面实例指针lpddsPrimary,此时主表面已经设置过了Clipper,
0 c8 J7 w  \  h% \* v" O$ ?7 Z我只是lpddsPrimary-> GetDC(),然后Textout,出现显示的文字和画面分离的情况,文字显示的位置正确,但保持在屏幕的最上端,当有其它窗口 ' B) U* l4 u  G2 n" K
经过时也会显示文字。难道HDC也要设置Clipper,不会吧,真不知道怎么解决?! 2 d" w7 E; A1 f+ [! K
另外是不是可以附加个覆盖页面(overlay),用来显示文字;但覆盖页面GetDC会失败,不能Textout,怎样才能在覆盖页面上显示文字?! $ Q6 o) i- ]: J
--------------------------------------------------------------------------------: y" Z8 y: v+ }) A" o. Q7 j
第5个回答7 d4 E" i, d7 m' t+ f5 X
我也做过这事,,我的方法是注入一个dll,枚举它当前程序里所有的surface,然后分别往枚举出来的surface上textout,看哪个能用,效果最好
, i- N! g3 n8 ^5 a/ u6 t$ W: b& \8 n( P) \2 w+ ]* p! x9 G
C/C++ code: o( c- {- g, f. ?
--------------------------------------------------------------------------------
' L+ I, ^/ N  C! }; ALPDIRECTDRAWSURFACE7 lpDDSPrimary;//主surface. u& [" Z) n* w" u
LPDIRECTDRAWSURFACE7  lpDDS[4];//用来保存枚举出的surface" N+ R7 A# |4 d* P
DWORD lpDDAddr = 0x00160e50;//lpDD的地址,通过调试很容易得到
: V7 [! n. {1 w# g- T# }LPDIRECTDRAW7 lpDD;
+ r1 E. I. q7 R! b5 t0 MDDSURFACEDESC2 ddsd;: x. {1 @+ s$ @2 _" L/ e

) p. b1 ~4 j* D% Gint si=0;//surface计数# c& s) k7 ?6 G% g3 {
DDSCAPS2 ddscaps ;
  b2 C% f& s5 @- E4 CHRESULT WINAPI _surfaceEnumCallback_GetPrimary( LPDIRECTDRAWSURFACE7 lpDDSurface, LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID /*lpContext*/ ) {
: h! |, G/ f, e4 X8 ?+ t$ W3 j    lpDDS[si] = lpDDSurface;
; v# c3 A+ {; ?" S: k8 D    si++;! o8 g9 V. O& s, |* {8 s
    wsprintf(buff2, "surface:%8x, width=%d, height=%d, buffCount:%d\n",2 T' a. A- a8 \
        lpDDSurface, lpDDSurfaceDesc->dwWidth,( J8 T  A0 M% b' T7 X7 a3 b
        lpDDSurfaceDesc->dwHeight,lpDDSurfaceDesc->dwBackBufferCount);8 Z2 }4 t# ?0 ]+ ?# a" \
    mout(buff2);
# v6 a8 `& c3 F$ L# L    if( lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE ) { //Primary
6 s7 Q# y, Q& D. ^3 d3 c8 S        lpDDSPrimary = lpDDSurface;4 A9 |3 M1 S0 s' T
        wsprintf(buff2, "primary surface: %8x\n", lpDDSurface);# n5 Y+ M5 f: c3 U/ l+ }
        mout(buff2);
$ l4 O( x" M( G    //    lpDDSurface->GetSurfaceDesc(&ddsd);
; ^5 Q3 W' ]3 u- ~% v    //  return DDENUMRET_CANCEL;7 ^( g+ s- E: N0 t. q2 f- g- z$ U4 Z9 F/ }
    }
8 \- S$ v$ J  D0 s0 W    //lpDDSurface->Release();
$ J4 x5 s! G' U. B0 x1 r% S    return DDENUMRET_OK;
$ ?- f7 x- V( b4 L+ ^/ F1 T}
* H, [* h& T: ?1 E; l1 ~- \//以上是回调函数,下面是枚举) {5 z2 ^* v: p/ ?
// Get lpDD
% w8 G& s6 e: c) P) wDWORD addr=0x00385b2c;% w5 N) L: i' \. ]  l, E7 ^
VirtualProtect( ( void * ) addr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect );) O# m6 f' I8 f6 w4 Z' N' ]& v
lpDDAddr=  *((DWORD*)addr);. \; j8 L0 j5 d' U
lpDD = (struct IDirectDraw7 *)lpDDAddr;
3 i8 f. m, ?* [2 h* S2 P' R  y: D9 k5 N, \0 v! U
// Enum Surface
2 O3 ]" q& d  F0 `1 _mout("now start to enum:\n");
( z: k. W0 f% |5 Z  S! Y: N2 [, \lpDD->EnumSurfaces( DDENUMSURFACES_DOESEXIST | DDENUMSURFACES_ALL, NULL, NULL, _surfaceEnumCallback_GetPrimary );
8 K4 l' h" w5 Nfor(int i=0;i<4;i++){0 x' M  |$ ^3 `, W7 z
    wsprintf(buff2, "found surface[%d]: %8x\n", i, lpDDS);
! L0 B+ Z7 s: Q& x4 Y: R    mout(buff2);$ U6 V. d4 H  y: d4 `% \* D
}
, B; z/ ^" y0 ?* h2 U1 e% \4 @! ]% z7 k

+ x6 l# `- q; d4 C, Z: z: e--------------------------------------------------------------------------------
! P- k) g9 ?6 [; a第6个回答
; ?) i* O/ V  Z& o5 M1 g帮顶 9 |* `  G1 G. X8 F- F7 K
--------------------------------------------------------------------------------
, p# V" t; S8 G0 v第7个回答
. N$ x. {; D; o4 x6 ?* f在它的backBuffer绘制试试。
! U/ Z7 _) W+ b' c; |--------------------------------------------------------------------------------) J. b8 w, y/ d& u- X
第8个回答9 g& ]' |. U6 b  n* t$ g( c
backBuffer 无法GetDC(),就无法TextOut
! i  o5 [3 B& u% \) o--------------------------------------------------------------------------------
* \! P$ w, ~- c7 ?& J% x/ f第9个回答
5 K! M0 m2 _0 q* r! p! c% HbackBuffer怎么会无法GetDC呢?那那个程序本身是怎么往上绘东西的啊。你看看是不是其它地方错了。
: F% k) G$ \4 m! T0 ?1 |7 H/ x0 B  g--------------------------------------------------------------------------------3 ?) L% N# ?3 {2 [( \. M
第10个回答
& M# p4 ?/ u5 U9 f5 X不会有错,那个程序是解码MP4视频流数据后,用ddraw加以显示,程序本身用不到GetDC,我用是为了显示文字。
% r$ a' b  r5 }* J& b) w$ B--------------------------------------------------------------------------------; ?& K" T* n3 F- e) M  U# z6 e
第11个回答1 @; M3 i+ s) X
那程序要往上面绘东西,Blt总得支持吧? " F% I) t. H% j! w+ U0 _
你自己建一个Surface,GetDC后TextOut你的文字,然后Blt到那个BackBuffer上去。 5 Y' K' w+ Z0 X" o
--------------------------------------------------------------------------------
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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