如题

解决方案 »

  1.   

    以前有一个文章,自己也没有试验过   
    但是这个方面的东西一般都是涉及到   windows内核编程,你可以看看这个方面的东西 
    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;implementationVar
      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;
      

  2.   

    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 thenResult:=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 thenResult:=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 thenResult:=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 thenResult:=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; len: Integer;
                            TabCount: Integer; TabPositions: PInteger; TabOrigin: Integer): Integer; stdcall;
    Var s: AnsiString;
    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 @OldTabbedTextOutA<>nil thenResult:=OldTabbedTextOutA(hdc,x,y,PAnsiChar(s),length(s),TabCount,TabPositions,TabOrigin)       else Result:=0;
        end else
    Result:=OldTabbedTextOutA(hdc,x,y,text,0,TabCount,TabPositions,TabOrigin);   except
        Result:=0;
      end;
    end;function NewTabbedTextOutW(hdc: HDC; x,y: Integer; text: PWideChar; len: Integer;
                            TabCount: Integer; TabPositions: PInteger; TabOrigin: Integer): 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 @OldTabbedTextOutW<>nil then
    Result:=OldTabbedTextOutW(hdc,x,y,PWideChar(s),length(s),TabCount,TabPositions,TabOrigin)       else Result:=0;
        end else
    Result:=OldTabbedTextOutW(hdc,x,y,text,0,TabCount,TabPositions,TabOrigin);   except
        Result:=0;
      end;
    end;function NewPolyTextOutA(hdc: HDC; pptxt: PPOLYTEXTA; count: Integer): BOOL; stdcall;
    Var s: String; i: Integer; ppnew: PPOLYTEXTA;
    begin
      ppnew:=nil;
      try
        Result:=False;
        if Count<0 then exit;
        if Count=0 then begin Result:=True; exit; end;
        GetMem(ppnew,count*sizeof(TPOLYTEXTA));
        For i:=1 to count do begin
          ppnew^:=pptxt^;
          if ppnew^.n<0 then ppnew^.n:=strlen(ppnew^.PAnsiChar);
          if ppnew^.n>0 then begin
            SetLength(s,ppnew^.n);
            FillChar(s[1],ppnew^.n+1,0);
            Move(ppnew^.PAnsiChar,s[1],ppnew^.n);
            if @ConvertTextFunction<>nil then
              s:=ConvertTextFunction(s);
            ppnew^.PAnsiChar:=PAnsiChar(s);
            ppnew^.n:=length(s);
            if @OldPolyTextOutA<>nil then
              Result:=OldPolyTextOutA(hdc,ppnew,1);
          end;
          Inc(pptxt);
        end;
      except
        Result:=False;
      end;
      if ppnew<>nil then FreeMem(ppnew);
    end;function NewPolyTextOutW(hdc: HDC; pptxt: PPOLYTEXTW; count: Integer): BOOL; stdcall;
    begin
      Result:=OldPolyTextOutW(hdc,pptxt,count);
    end;
      

  3.   

    《delphi下深入windows核心编程》这本书有关于 金山词霸里那个屏幕取词的介绍
      

  4.   

    金山词霸屏幕取词技术揭密
    http://blog.joycode.com/yaodong/articles/25506.aspx
    读取金山词霸的词库程序
    http://www.blog.edu.cn/user2/43992/archives/2006/1231444.shtml
      

  5.   

    朋友,先要导入 XDICTGRB_TLB ,然后用下面的source,注意TForm1 = class(TForm,IXDictGrabSink)   //!!!
    interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, OleServer, XDICTGRB_TLB;type
      TForm1 = class(TForm,IXDictGrabSink)   //!!!
        GrabProxy1: TGrabProxy;
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        function QueryWord(const WordString: WideString;lCursorX: Integer;
              lCursorY: Integer;const SentenceString: WideString;
                var lLoc: Integer; var lStart: Integer): Integer; safecall;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      GrabProxy1.GrabInterval :=1;
      GrabProxy1.GrabMode :=XDictGrabMouse;
      GrabProxy1.GrabEnabled :=true;
      GrabProxy1.AdviseGrab(self);
    end;function TForm1.QueryWord(const   WordString:   WideString;   lCursorX,  
        lCursorY:   Integer;   const   SentenceString:   WideString;   var   lLoc,
        lStart:   Integer):   Integer;  
    begin
        memo1.Text := memo1.text+SentenceString+#13#10;
    end;
    end.
      

  6.   

    呵呵,我也是看了《delphi下深入windows核心编程》,才弄明白,不过,好像里面附的代码也没有金山那么好用,呵呵,没有仔细去研究.