http://blog.csdn.net/dbyoung/article/details/7020620

通过控件句柄获取控件实例

创建一Delphi工程,放置一个TEdit和TButton,在Edit1中随便输入一些文字。

 

 

[delphi] view plaincopy
  1.   ---------------通过控件句柄获取控件实例-------------------------------------------- 
  2.   ---------------原理详见 Classes.pas 单元,13045行 <Delphi7>------------------------ 
  3.   ---------------原理详见 Classes.pas 单元,11613行 <Delphi2007>--------------------- 
  4.   ---------------原理详见 Classes.pas 单元,13045行 <Delphi2010>--------------------- 
  5.   ---------------原理详见 Classes.pas 单元,13512行 <DelphiXE>----------------------- 
  6. }  
  7. function GetInstanceFromhWnd(const hWnd: Cardinal): TWinControl;  
  8. type  
  9.   PObjectInstance = ^TObjectInstance;  
  10.   
  11.   TObjectInstance = packed record  
  12.     Code: Byte;            { 短跳转 $E8 }  
  13.     Offset: Integer;       { CalcJmpOffset(Instance, @Block^.Code); }  
  14.     Next: PObjectInstance; { MainWndProc 地址 }  
  15.     Self: Pointer;         { 控件对象地址 }  
  16.   end;  
  17. var  
  18.   wc: PObjectInstance;  
  19. begin  
  20.   Result := nil;  
  21.   wc     := Pointer(GetWindowLong(hWnd, GWL_WNDPROC));  
  22.   if wc <> nil then  
  23.   begin  
  24.     Result := wc.Self;  
  25.   end;  
  26. end;  
  27.   
  28. procedure TForm1.btn1Click(Sender: TObject);  
  29. begin  
  30.   btn1.Caption := TEdit(GetInstanceFromhWnd(edt1.Handle)).Text;  
  31. end;  


 

看我们是如何获取了Edit1中的文字的。很神奇把,懂VCL代码,就没有那么神奇了。