设为首页 加入收藏 网站搜索 繁體中文 中国建站网 — 站长资源平台

攻破“金山词霸”的技术堡垒!

来源网络收集 作者:佚名 时间:2007-4-26 4:19:09 该文得分0
 

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;
                          maxExtent

[1] [2] [3] [4] [5] [6]  下一页

相关文章
广告赞助
网友评论

共有 0 位网友发表了评论,平均得分: 0 查看完整内容

用户名:

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

(注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码