|
library PigLatinDll;
uses Windows, SysUtils, Classes, HookTextUnit in ''''HookTextUnit.pas'''';
function PigLatinWord(s: String): String; Var start: String; Capitalize, AllCapitals: Boolean; i: Integer; begin Result:=s; if length(s)<=1 then exit; Capitalize:=IsCharUpper(s[1]); AllCapitals:=True; for i:=1 to length(s) do begin if IsCharLower(s[i]) then begin AllCapitals:=False; break; end; end; start:=lowercase(copy(s,1,2)); if (start[1]<''''a'''') or (start[1]>''''z'''') then exit; if (start[1] in [''''a'''',''''e'''',''''i'''',''''o'''',''''u'''']) then start:=''''''''; if (start<>''''ch'''') and (start<>''''th'''') and (start<>''''sh'''') and (start<>''''wh'''')
and (start<>''''qu'''') and (start<>''''kn'''') and (start<>''''wr'''') then delete(start,2,1); Result:=copy(s,length(start)+1,length(s))+start; if start='''''''' then Result:=Result+''''yay'''' else Result:=Result+''''ay''''; if AllCapitals then result:=Uppercase(Result) else if Capitalize then result[1]:=Upcase(result[1]); end;
function IntToRoman(n: Integer): String; Var i, units, tens, hundreds, thousands: Integer; begin If (n>=5000) or (n<=0) then Result:=IntToStr(n) else begin thousands:=n div 1000; n:=n mod 1000; hundreds:=n div 100; n:=n mod 100; tens:=n div 10; n:=n mod 10; units:=n; Result:=''''''''; for i:=1 to Thousands do begin Result:=Result+''''M''''; end; Case Hundreds of 1: Result:=Result+''''C''''; 2: Result:=Result+''''CC''''; 3: Result:=Result+''''CCC''''; 4: Result:=Result+''''CD''''; 5: Result:=Result+''''D''''; 6: Result:=Result+''''DC''''; 7: Result:=Result+''''DCC''''; 8: Result:=Result+''''DCCC''''; 9: Result:=Result+''''CM''''; end; Case Tens of 1: Result:=Result+''''X''''; 2: Result:=Result+''''XX''''; 3: Result:=Result+''''XXX''''; 4: Result:=Result+''''XL''''; 5: Result:=Result+''''L''''; 6: Result:=Result+''''LX''''; 7: Result:=Result+''''LXX''''; 8: Result:=Result+''''LXXX''''; 9: Result:=Result+''''XC''''; end; Case Units of 1: Result:=Result+''''I''''; 2: Result:=Result+''''II''''; 3: Result:=Result+''''III''''; 4: Result:=Result+''''IV''''; 5: Result:=Result+''''V''''; 6: Result:=Result+''''VI''''; 7: Result:=Result+''''VII''''; 8: Result:=Result+''''VIII''''; 9: Result:=Result+''''IX''''; end; end; end;
function LatinNumber(s: String): String; Var n: Integer; begin try n:=StrToInt(s); Result:=IntToRoman(n); except Result:=s; end; end;
function Conv(s: String): String; Var i: Integer; w: String; begin Result:=''''''''; try if s='''''''' then exit; i:=1; while (i<=length(s)) do begin while (i<=length(s)) and (s[i]<='''' '''') do begin Result:=Result+s[i]; Inc(i); end;
// convert any numbers into latin numbers w:=''''''''; while (i<=length(s)) and (s[i]>=''''0'''') and (s[i]<=''''9'''') do begin w:=w+s[i]; Inc(i); end; Result:=Result+LatinNumber(w);
// add any other symbols unchanged (for now) w:=''''''''; while (i<=length(s)) and not IsCharAlphaNumeric(s[i]) do begin w:=w+s[i]; Inc(i); end; Result:=Result+w;
// convert whole words into pig latin w:=''''''''; while (i<=length(s)) and IsCharAlpha(s[i]) do begin w:=w+s[i]; Inc(i); end; Result:=Result+PigLatinWord(w); end; except end; end;
function GetMsgProc(code: integer; removal: integer; msg: Pointer): Integer; stdcall; begin Result:=0; end;
Var HookHandle: THandle;
procedure StartHook; stdcall; begin HookHandle:=SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, HInstance, 0); end;
procedure StopHook; stdcall; begin UnhookWindowsHookEx(HookHandle); end;
exports StartHook, StopHook;
begin HookTextOut(Conv); end.
====================================================
unit HookTextUnit;
interface uses Windows, SysUtils, Classes, PEStuff;
type TConvertTextFunction = function(text: String): String; TTextOutA = function(hdc: HDC; x,y: Integer; text: PAnsiChar; len: Integer): BOOL; stdcall; TTextOutW = function(hdc: HDC; x,y: Integer; text: PWideChar; len: Integer): BOOL; stdcall; TExtTextOutA = function(hdc: HDC; x,y: Integer; Options: DWORD; Clip: PRect; text: PAnsiChar; len: Integer; dx: PInteger): BOOL; stdcall; TExtTextOutW = function(hdc: HDC; x,y: Integer; Options: DWORD; Clip: PRect; text: PWideChar; len: Integer; dx: PInteger): BOOL; stdcall; TDrawTextA = function(hdc: HDC; text: PAnsiChar; len: Integer; rect: PRect; Format: DWORD): Integer; stdcall; TDrawTextW = function(hdc: HDC; text: PWideChar; len: Integer; rect: PRect; Format: DWORD): Integer; stdcall; TDrawTextExA = function(hdc: HDC; text: PAnsiChar; len: Integer; rect: PRect; Format: DWORD; DTParams: PDrawTextParams): Integer; stdcall; TDrawTextExW = function(hdc: HDC; text: PWideChar; len: Integer; rect: PRect; Format: DWORD; DTParams: PDrawTextParams): Integer; stdcall;
TTabbedTextOutA = function(hdc: HDC; x,y: Integer; text: PAnsiChar; len: Integer; TabCount: Integer; TabPositions: PInteger; TabOrigin: Integer): Integer; stdcall; TTabbedTextOutW = function(hdc: HDC; x,y: Integer; text: PWideChar; len: Integer; TabCount: Integer; TabPositions: PInteger; TabOrigin: Integer): Integer; stdcall; TPolyTextOutA = function(hdc: HDC; pptxt: PPOLYTEXTA; count: Integer): BOOL; stdcall; TPolyTextOutW = function(hdc: HDC; pptxt: PPOLYTEXTW; count: Integer): BOOL; stdcall;
TGetTextExtentExPointA = function(hdc: HDC; text: PAnsiChar; len: Integer; maxExtent: Integer; Fit: PInteger; Dx: PInteger; Size: Pointer): BOOL; stdcall; TGetTextExtentExPointW = function(hdc: HDC; text: PWideChar; len: Integer; &nbs [1] [2] [3] [4] [5] [6] 下一页 |