hook住exttextout函数之后

talip1106 2017-07-10 03:24:49
我用hook勾住ExtTextOut函数,并获得了lpString也就是获得了输出字符串。现在遇到个问题,我替换了lpString的内容后交给ExtTextout函数继续输出,出现字符串显示不全的问题。比如,我截获的字符串是“测试”,然后我替换成“success”后输出,输出结果只有succe这几个字符可见。想了各种办法,也搜遍了网络,没有找到其解决办法。我想如果能获取原先输出文本区域的大小,并把它拉伸一下应该可以解决这问题,但是实在是没有找到能这么做的API函数。恳请各位大侠支支招吧,万分感谢!

function NewExtTextOutW(theDC: HDC; nXStart, nYStart: integer; toOptions:
Longint; p_rect: PRect;
Str: Pwidechar; Count: Longint; Dx: PInteger): BOOL; stdcall;
type
TExtTextOutW=function (theDC: HDC; nXStart, nYStart: integer; toOptions:Longint;
p_rect: PRect; Str: Pwidechar; Count: Longint; Dx: PInteger): BOOL; stdcall;
var
dwBytes: DWORD;
poOri, poDC, poText, poMouse: TPoint;
Size: TSize;
Rec,tmprec:TRect;
faint:boolean;
nTextLen,uf:integer;
tmpstr:string;
hf:HFONT;
tm:TEXTMETRIC;
begin
Hook[fExtTextOutW].Restore;{暂停截取API,恢复被截的函数}
try
tmpstr:='success';{我将一切截获的字符串替换成success}
str:=pwidechar(tmpstr);
count:=length(tmpstr);
GetTextExtentPointW(theDC, Str, Count, Size);{计算字符串宽高}
if toOptions<>ETO_GLYPH_INDEX then
toOptions:=ETO_OPAQUE and ETO_IGNORELANGUAGE;{刚开始以为是这个参数在搞鬼,我就写死了。如果这个参数等于ETO_CLIPPED,输出文字就会控制在在temprec区域内,不会超出}
tmprec:=Rect(nXStart,nYStart,nXStart+size.Width,nYStart+size.Height); {计算输出字符串截获区域大小,其实这一行可以不要,我是实在没辙做了一下测试,这个区域的宽度无论改多大,对最后输出结果没影响}
finally
{调用被截的函数}
result := TExtTextOutW(Hook[fExtTextOutW].OldFunction)(theDC, nXStart, nYStart, toOptions,@tmprec, Str, Count, nil);
end;
Hook[fExtTextOutW].Change;{重新截取API}
end;
...全文
972 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
talip1106 2017-07-11
  • 打赏
  • 举报
回复
有个小发现,delphi的label不会转变成static...没有句柄好麻烦啊。。。 自己顶一个,继续坐等高手出现!
talip1106 2017-07-10
  • 打赏
  • 举报
回复
截获前的截图

截获并替换字符串内容后截图

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧