我用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;