我有一个位于另一个进程窗口的VCL控件的Hwnd.有没有办法通过
Windows API获取该控件的VCL名称(TControl.Name属性)?
我需要该名称,因为该窗口上有几个TEdit,我需要识别我想要的一个,以便向其发送WM_SETTEXT消息.
我需要该名称,因为该窗口上有几个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;