WEB开发网      濠电姷鏁告繛鈧繛浣冲洤纾瑰┑鐘宠壘閻ょ偓銇勯幇鍫曟闁稿鍠愰妵鍕冀閵娧佲偓鎺楁⒒閸曨偄顏柡宀嬬畱铻e〒姘煎灡绗戦梻浣筋嚙濮橈箓顢氳濠€浣糕攽閻樿宸ュΔ鐘叉啞缁傚秹宕滆绾惧ジ寮堕崼娑樺缂佹宀搁弻鐔风暋閻楀牆娈楅梺璇″枓閺呯姴鐣疯ぐ鎺濇晝闁靛牆妫欓蹇旂節閻㈤潧浠﹂柛銊ョ埣楠炴劙骞橀鑲╋紱闂佽宕樼粔顔裤亹閹烘挸浜归梺缁樺灦閿曗晛螞閸曨垱鈷戦柟鑲╁仜婵″ジ鎮楀☉鎺撴珖缂侇喖顑呴鍏煎緞濡粯娅囬梻浣瑰缁诲倿寮绘繝鍥ㄦ櫇闁稿本绋撻崢鐢告煟鎼淬垻鈯曢柨姘舵煟韫囥儳绋荤紒缁樼箖缁绘繈宕橀妸褌绱濋梻浣筋嚃閸ㄤ即宕弶鎴犳殾闁绘梻鈷堥弫鍌炴煕閳锯偓閺呮瑧妲愬Ο琛℃斀闁绘劕妯婇崵鐔封攽椤旇棄鍔ら摶鐐烘煕閺囥劌澧柛娆忕箻閺屽秹宕崟顒€娅g紓浣插亾濠㈣泛顑囩粻楣冩煙鐎涙ḿ绠橀柨娑樼У椤ㄣ儵鎮欓鍕紙闂佽鍠栫紞濠傜暦閹偊妲诲┑鈩冨絻椤兘寮诲☉銏犖╅柕澶堝労閸斿绱撴担绋库偓鍝ョ矓瑜版帒鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘 ---闂傚倸鍊烽悞锔锯偓绗涘厾娲煛閸涱厾顔嗛梺璺ㄥ櫐閹凤拷
开发学院软件开发Delphi 所见及所得的类分析跟踪器 阅读

所见及所得的类分析跟踪器

 2006-02-04 13:52:03 来源:WEB开发网 闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�闂傚倸鍊风粈渚€骞夐敓鐘插瀭闁汇垹鐏氬畷鏌ユ煙閹殿喖顣奸柛搴$У閵囧嫰骞掗幋婵冨亾閻㈢ǹ纾婚柟鐐灱濡插牊绻涢崱妤冃℃繛宀婁簽缁辨捇宕掑鎵佹瀸闂佺懓鍤栭幏锟�濠电姷鏁告慨顓㈠箯閸愵喖宸濇い鎾寸箘閹规洟姊绘笟鈧ḿ褍煤閵堝悿娲Ω閳轰胶鍔﹀銈嗗笂閼冲爼鍩婇弴銏$厪闁搞儮鏅涙禒褏绱掓潏鈺佷槐闁轰焦鎹囬弫鎾绘晸閿燂拷闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�  闂傚倸鍊烽懗鑸电仚缂備胶绮〃鍛村煝瀹ュ鍗抽柕蹇曞У閻庮剟姊虹紒妯哄闁诲繑姘ㄩ埀顒佸嚬閸撶喎顫忓ú顏勫瀭妞ゆ洖鎳庨崜浼存⒑闁偛鑻晶顔剧磼婢跺﹦绉虹€殿喖顭锋俊姝岊槷闁稿鎹囧Λ鍐ㄢ槈濞嗗繑娈橀梻浣风串缂嶁偓濞存粠鍓熼崺鈧い鎺戝€归弳顒勬煕鐎n亷韬€规洑鍗冲鍊燁槾闁哄棴绠撻弻銊╂偆閸屾稑顏�
核心提示:{以下代码可以分析Windows下的鼠标处的对象类名,句柄及其递归父类等信息,所见及所得的类分析跟踪器,是很久以前火鸟的工具软件视窗超人中的一段代码,其触发使用了Timer控件,新建一个窗体,把代码贴入即可,其实更好的实现是用Windows Mouse Hook来做触发,就当抛砖引玉吧;此代码还实现了不依赖于Windo

{以下代码可以分析Windows下的鼠标处的对象类名,句柄及其递归父类等信息,是很久以前火鸟的工具软件视窗超人中的一段代码。其触发使用了Timer控件,其实更好的实现是用Windows Mouse Hook来做触发,就当抛砖引玉吧;此代码还实现了不依赖于Windows2000以上要求的半透明窗口(在Win98/WinMe下也可半透明),本实现的实现其实比较类似于金山词霸的即指即译功能,只不过大家在做不同的应用而已。 在Delphi环境下,新建一个窗体,把代码贴入即可,本工具主要会对做Windows环境下的开发人员工作有些帮助(如分析别人的程序的控件对象,跟踪对象句柄等)}
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
   PRocedure Timer1Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
  private
   { Private declarations }
  public
   { Public declarations }
  end;

var
  Form1: TForm1;
  Timer1: TTimer;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var poss:TPoint;
   ic:Hdc;
   Bmp:TbitMap;
  Hands: HWND;
  Buf: array[0..129] of Char;
  Stmp:TStrings;
  itmp,iwidth,iheight:integer;
  sWord,sline:string;
begin
  GetCursorPos(Poss);
  with self do
  begin
   if (poss.x <> tag-10) or (poss.y<>timer1.Tag-10) then left:=screen.Width
   else
   begin
    Hands := WindowFromPoint(Poss);
    if (left=tag) or (hands=handle) then exit;
    stmp:=TStringList.create;
    stmp.Add('句柄: '+IntToStr(Hands));
    GetClassName(Hands, Buf, 128);
    stmp.Add ('类名: '+Buf);
    itmp:=GetParent(Hands);
    while itmp>0  do
    begin
      GetClassName(itmp, Buf, 128);
      if buf<>'' then stmp.Add (inttostr(stmp.Count-1)+'级父类: '+Buf);
      itmp:=GetParent(itmp);
    end;
    SendMessage(Hands, WM_GETTEXT, 128, Integer(@Buf));
    sword:='字符: '+buf;
    if length(sword)>132 then sword:=sword+'....';
    repeat
     itmp:=pos(chr(10),sWord);
     if itmp>0 then
     begin
      sline:=copy(sWord,1,itmp-1);
      sword:=copy(sWord,itmp+1,length(sword));
     end
     else sline:=sword;
     itmp:=pos(chr(13),sline);
     if itmp>0 then sline:=copy(sline,1,itmp-1);
     stmp.Add(sline);
    until sline=sword;
    iwidth:=0;
    for itmp:=0 to stmp.Count-1 do if canvas.TextWidth(stmp[itmp])+15>iWidth then iWidth:=canvas.TextWidth(stmp[itmp])+15;
    iheight:=stmp.Count*(canvas.TextHeight(stmp[0])+2);
    width:=iwidth;
    height:=iheight;
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE+ SWP_NOSIZE+SWP_NOACTIVATE+SWP_NOOWNERZORDER);
    ic:=CreateDC('DISPLAY',nil,nil,nil);
    if tag+width>screen.Width then tag:=screen.Width-width;
    if timer1.Tag +height>screen.Height then timer1.Tag:=screen.Height-height;
    Bmp:=Tbitmap.Create;
    bmp.Width := Width;
    bmp.Height :=Height;
    bitblt(bmp.Canvas.handle,0,0,Width,Height,ic,tag,timer1.Tag,SRCCOPY);
    Left :=tag;
    Top :=timer1.tag;
    bitblt(canvas.handle,0,0,Width,Height,bmp.Canvas.handle,0,0,SRCAND);
    canvas.Font.Color:=$0000FF;
    SetBkMode(canvas.handle,TRANSPARENT);
    for itmp:=0 to stmp.Count-1 do canvas.TextOut(5,5+itmp*canvas.TextHeight(stmp[itmp]),TrimRight(stmp[itmp]));
    deletedc(ic);
    bmp.free;
    stmp.Free;
   end;
   tag:=poss.x+10;
   timer1.Tag:=poss.y+10;
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  self.BorderStyle:=bsNone;
  Timer1:=TTimer.Create(self);
  timer1.Interval:=300;
  timer1.OnTimer:=Timer1Timer;
end;

end.

Tags:所得 分析 跟踪器

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接