delphi – 有没有办法通过Windows API获取VCL控件的名称?

前端之家收集整理的这篇文章主要介绍了delphi – 有没有办法通过Windows API获取VCL控件的名称?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个位于另一个进程窗口的VCL控件的Hwnd.有没有办法通过 Windows API获取该控件的VCL名称(TControl.Name属性)?
我需要该名称,因为该窗口上有几个TEdit,我需要识别我想要的一个,以便向其发送WM_SETTEXT消息.

这两个应用程序都是用Delphi 2010构建的.

解决方法

Delphi具有内置函数FindControl(),返回指定hWnd的TWinControl.但它适用于VCL的相同实例.我想你应该调查一下.指向TWinControl对象后,其名称(字符串)位于8个偏移量.您可以尝试ReadProcessMemory读取它.这里的主要问题是创建适合您需要的FindControl()版本.

编辑:(最后得到它:D)调用GetWinControlName函数

// Get Pointer to TWinControl in another process
function GetWinControl(Wnd: HWND; out ProcessId: THandle): Pointer;
var
  WindowAtomString: String;
  WindowAtom: ATOM;
begin
  if GetWindowThreadProcessId(Wnd,ProcessId) = 0 then RaiseLastOSError;

  // This is atom for remote process (See controls.pas for details on this)
  WindowAtomString := Format('Delphi%.8X',[ProcessID]);
  WindowAtom := GlobalFindAtom(PChar(WindowAtomString));
  if WindowAtom = 0 then RaiseLastOSError;

  Result := Pointer(GetProp(Wnd,MakeIntAtom(WindowAtom)));
end;

function GetWinControlName(Wnd: HWND): string;
var
  ProcessId: THandle;
  ObjSelf: Pointer;
  Buf: Pointer;
  bytes: Cardinal;
  destProcess: THandle;
begin
  ObjSelf := GetWinControl(Wnd,ProcessId);

  destProcess := OpenProcess(PROCESS_VM_READ,TRUE,ProcessId);
  if destProcess = 0 then RaiseLastOSError;

  try
    GetMem(Buf,256);
    try
      if not ReadProcessMemory(destProcess,Pointer(Cardinal(ObjSelf) + 8),Buf,4,bytes) then RaiseLastOSError;
      if not ReadProcessMemory(destProcess,Pointer(Cardinal(Buf^)),256,bytes) then RaiseLastOSError;
      Result := PChar(Buf);
    finally
      FreeMem(Buf);
    end;
  finally
    CloseHandle(destProcess);
  end;
end;
原文链接:https://www.f2er.com/delphi/102763.html

猜你在找的Delphi相关文章