我用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;
uj5u.com熱心網友回復:
截獲前的截圖
截獲并替換字串內容后截圖
uj5u.com熱心網友回復:
有個小發現,delphi的label不會轉變成static...沒有句柄好麻煩啊。。。自己頂一個,繼續坐等高手出現!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/52138.html
上一篇:求助:網站爬蟲!!!
