根据 FindControl 的原理,写了个函数:
function FindControlEx(Handle: HWnd): TWinControl;
var
ControlAtom: TAtom;
AtomText: array[0..31] of Char;
begin
Result := nil;
if Handle = 0 then Exit;
ControlAtom := GlobalFindAtom(
StrFmt(AtomText, 'ControlOfs%.8X%.8X',
[GetWindowLong(Handle, GWL_HINSTANCE),
GetWindowThreadPRocessID(Handle, nil)]));
if ControlAtom <> 0 then
begin
Result := Pointer(GetProp(Handle, MakeIntAtom(ControlAtom)));
end;
end;
但是,这个函数没有很大用处,因为它返回的实际是指向 WinControl 所占用内存块的指针
,当这个Wincontrol 在其它进程中时,由于各进程地址空间是相互独立的,该指针只对
那个 Wincontrol 所在进程有效。你直接用这个指针时,你实际上访问的还是你自己进程中
的地址空间,由于这个指针对于你自己的进程并没有意义,就会引起异常。