我有一个位于另一个进程窗口的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;
原文地址:https://www.jb51.cc/delphi/102763.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。