p; maxExtent: Integer; Fit: PInteger; Dx: PInteger; Size: Pointer): BOOL; stdcall; TGetTextExtentPoint32A = function(hdc: HDC; text: PAnsiChar; len: Integer; Size: Pointer): BOOL; stdcall; TGetTextExtentPoint32W = function(hdc: HDC; text: PWideChar; len: Integer; Size: Pointer): BOOL; stdcall; TGetTextExtentPointA = function(hdc: HDC; text: PAnsiChar; len: Integer; Size: Pointer): BOOL; stdcall; TGetTextExtentPointW = function(hdc: HDC; text: PWideChar; len: Integer; Size: Pointer): BOOL; stdcall;
PPointer = ^Pointer;
TImportCode = packed record JumpInstruction: Word; // should be $25FF AddressOfPointerToFunction: PPointer; end; PImportCode = ^TImportCode;
procedure HookTextOut(ConvertFunction: TConvertTextFunction); procedure UnhookTextOut;
implementation
Var ConvertTextFunction: TConvertTextFunction = nil; OldTextOutA: TTextOutA = nil; OldTextOutW: TTextOutW = nil; OldExtTextOutA: TExtTextOutA = nil; OldExtTextOutW: TExtTextOutW = nil; OldDrawTextA: TDrawTextA = nil; OldDrawTextW: TDrawTextW = nil; OldDrawTextExA: TDrawTextExA = nil; OldDrawTextExW: TDrawTextExW = nil; OldTabbedTextOutA: TTabbedTextOutA = nil; OldTabbedTextOutW: TTabbedTextOutW = nil; OldPolyTextOutA: TPolyTextOutA = nil; OldPolyTextOutW: TPolyTextOutW = nil; OldGetTextExtentExPointA: TGetTextExtentExPointA = nil; OldGetTextExtentExPointW: TGetTextExtentExPointW = nil; OldGetTextExtentPoint32A: TGetTextExtentPoint32A = nil; OldGetTextExtentPoint32W: TGetTextExtentPoint32W = nil; OldGetTextExtentPointA: TGetTextExtentPointA = nil; OldGetTextExtentPointW: TGetTextExtentPointW = nil;
function StrLenW(s: PWideChar): Integer; Var i: Integer; begin if s=nil then begin Result:=0; exit; end; i:=0; try while (s[i]<>#0) do inc(i); except end; Result:=i; end;
function NewTextOutA(hdc: HDC; x,y: Integer; text: PAnsiChar; len: Integer): BOOL; stdcall; Var s: String; begin try if Len<0 then Len:=strlen(text); If Len>0 then begin SetLength(s,len); FillChar(s[1],len+1,0); Move(text^,s[1],len); if @ConvertTextFunction<>nil then s:=ConvertTextFunction(s); if @OldTextOutA<>nil then Result:=OldTextOutA(hdc,x,y,PAnsiChar(s),length(s)) else Result:=False; end else Result:=OldTextOutA(hdc,x,y,PAnsiChar(s),0); except Result:=False; end; end;
function NewTextOutW(hdc: HDC; x,y: Integer; text: PWideChar; len: Integer): BOOL; stdcall; Var s: WideString; begin try if Len<0 then Len:=strlenW(text); If Len>0 then begin SetLength(s,len); FillChar(s[1],len*2+2,0); Move(text^,s[1],len*2); if @ConvertTextFunction<>nil then s:=ConvertTextFunction(s); if @OldTextOutW<>nil then Result:=OldTextOutW(hdc,x,y,PWideChar(s),length(s)) else Result:=False; end else Result:=OldTextOutW(hdc,x,y,PWideChar(s),0); except Result:=False; end; end; function NewExtTextOutA(hdc: HDC; x,y: Integer; Options: DWORD; Clip: PRect; text: PAnsiChar; len: Integer; dx: PInteger): BOOL; stdcall; Var s: String; begin try if Len<0 then Len:=strlen(text); // ??? if Len>0 then begin SetLength(s,len); FillChar(s[1],len+1,0); Move(text^,s[1],len); if @ConvertTextFunction<>nil then s:=ConvertTextFunction(s); if @OldExtTextOutA<>nil then
Result:=OldExtTextOutA(hdc,x,y,Options,Clip,PAnsiChar(s),length(s),dx) else Result:=False; end else Result:=OldExtTextOutA(hdc,x,y,Options,Clip,text,0,dx); except Result:=False; end; end;
function NewExtTextOutW(hdc: HDC; x,y: Integer; Options: DWORD; Clip: PRect; text: PWideChar; len: Integer; dx: PInteger): BOOL; stdcall; Var s: WideString; begin try if Len<0 then Len:=strlenW(text); If Len>0 then begin SetLength(s,len); FillChar(s[1],len*2+2,0); Move(text^,s[1],len*2); if @ConvertTextFunction<>nil then s:=ConvertTextFunction(s); if @OldExtTextOutW<>nil then
Result:=OldExtTextOutW(hdc,x,y,Options,Clip,PWideChar(s),length(s),dx) else Result:=False; end else Result:=OldExtTextOutW(hdc,x,y,Options,Clip,text,0,dx); except Result:=False; end; end;
function NewDrawTextA(hdc: HDC; text: PAnsiChar; len: Integer; rect: PRect; Format: DWORD): Integer; stdcall; Var s: String; begin try if Len<0 then Len:=strlen(text); // ??? if Len>0 then begin SetLength(s,len); FillChar(s[1],len+1,0); Move(text^,s[1],len); if @ConvertTextFunction<>nil then s:=ConvertTextFunction(s); if @OldDrawTextA<>nil then Result:=OldDrawTextA(hdc,PAnsiChar(s),length(s),rect,Format) else Result:=0; end else Result:=OldDrawTextA(hdc,text,0,rect,Format); except Result:=0; end; end;
function NewDrawTextW(hdc: HDC; text: PWideChar; len: Integer; rect: PRect; Format: DWORD): Integer; stdcall; Var s: WideString; begin try if Len<0 then Len:=strlenW(text); if len>0 then begin SetLength(s,len); FillChar(s[1],len*2+2,0); Move(text^,s[1],len*2); if @ConvertTextFunction<>nil then s:=ConvertTextFunction(s); if @OldDrawTextW<>nil then Result:=OldDrawTextW(hdc,PWideChar(s),length(s),rect,Format) else Result:=0; end else Result:=OldDrawTextW(hdc,text,0,rect,Format); except Result:=0; end; end;
function NewDrawTextExA(hdc: HDC; text: PAnsiChar; len: Integer; rect: PRect; Format: DWORD; DTParams: PDrawTextParams): Integer; stdcall; Var s: String; begin try if Len<0 then Len:=strlen(text); if len>0 then begin SetLength(s,len); FillChar(s[1],len+1,0); Move(text^,s[1],len); if @ConvertTextFunction<>nil then s:=ConvertTextFunction(s); if @OldDrawTextExA<>nil then
Result:=OldDrawTextExA(hdc,PAnsiChar(s),length(s),rect,Format,DTParams) else Result:=0; end else Result:=OldDrawTextExA(hdc,text,0,rect,Format,DTParams); except Result:=0; end; end;
function NewDrawTextExW(hdc: HDC; text: PWideChar; len: Integer; rect: PRect; Format: DWORD; DTParams: PDrawTextParams): Integer; stdcall; Var s: WideString; begin try if Len<0 then Len:=strlenW(text); if Len>0 then begin SetLength(s,len); FillChar(s[1],len*2+2,0); Move(text^,s[1],len*2); if @ConvertTextFunction<>nil then s:=ConvertTextFunction(s); if @OldDrawTextExW<>nil then
Result:=OldDrawTextExW(hdc,PWideChar(s),length(s),rect,Format,DTParams) else Result:=0; end else Result:=OldDrawTextExW(hdc,text,0,rect,Format,DTParams); except Result:=0; end; end;
function NewTabbedTextOutA(hdc: HDC; x,y: Integer; text: PAnsiChar上一页 [1] [2] [3] [4] [5] [6] 下一页 |