编程教程
您现在的位置: 中国个人站长站 >> 网络编程 >> Delphi >> 教程正文 攻破“金山词霸”的技术堡垒!
推荐位

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

中国个人站长站 Delphi 点击数: 更新时间:2005-8-28 11:20:15

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: 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);
   &n

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

教程录入:swh    责任编辑:swh 
个人站长站与你风雨同舟!
本站所提供的资源均来源于互联网,如有侵权行为,请与本站管理员联系,我们会第一时间删除!
·如果您发现《攻破“金山词霸”的技术堡垒!》文章有错误,也请通知我们修改!
联系邮箱chinageren#126.com,谢谢支持!
站内搜索:
广告服务 | 友情链接 | 联系我们 | 免责声明 | 用户留言 | 网站导航
版权所有:中国个人站长站 2007-2008 未经授权禁止复制或建立镜像 客服QQ号:112731235
copyright © 2007-2008 www.ChinaGeRen.com online services. all rights reserved. 苏ICP备05000059号