我用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;
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;
解决方案 »
- ICSeqCompressFrame总是返回空值
- 简单报表打印问题,请DELPHI高手帮忙,多谢,在线求解!!!!!!!!!!!!!!!!1111
- 我真的相信这世界上有鬼!
- 在lvMessageParts中显示图标和文字,可是为什么显示DOC文档时显示的图标是文件夹的图标?
- 关键字:*.val is out of date是什么原因----在线等待
- 有没有关于Delphi7.0控件详细介绍(包括事件、属性、还有一些函数)的书。
- cxGrid的单元格动态绑定LookupComboBox列表
- 那位大虾能告诉我,怎样删除面板上的控件
- 如何设置打印机的映射模式,setMapMode(printer.handle,MM_TEXT)为什么出错
- 那里有tts(text to speech)控件下载?
- Excel中,有没有简便方法获取某行在页面中的位置?
- 如何用delphi7开发后台程序接收前台发的json报文?
自己顶一个,继续坐等高手出现!