С точки зрения Win32 API, элементы управления пользовательского интерфейса не имеют имен, поэтому вы не можете попросить API вернуть Name
элемента управления пользовательского интерфейса в другом процессе, поскольку такого значения не существует. Имена - это особенность структуры пользовательского интерфейса, используемой приложением (VCL в случае C ++ Builder), и вы не можете напрямую обращаться к платформам через границы процессов. Вам потребуется сотрудничество с приложением-владельцем элемента управления.
Например, одним из способов было бы заставить оба приложения вызывать RegisterWindowMessage()
, чтобы зарегистрировать пользовательское оконное сообщение, а затем ваше приложение может опубликовать это сообщение в другом приложении, указав желаемый элемент управления HWND
и свой собственный HWND
как параметры. Затем другое приложение может SendMessage()
Name
элемента управления вернуться к HWND
вашего приложения, используя сообщение WM_COPYDATA
, которое вы можете использовать для соответствующего обновления своего списка.
В платформе VCL вы можете преобразовать HWND
в TWinControl*
указатель, используя функцию FindControl()
. Он вернет NULL
, если HWND
не принадлежит вызывающему процессу, в противном случае вы можете скопировать значение из его свойства Name
. Например:
const UINT WM_GETCONTROLNAME = RegisterWindowMessage("WM_GetControlName");
const UINT WM_GETCONTROLNAME_RESULT = RegisterWindowMessage("WM_GetControlName_Result");
#include <pshpack1.h>
struct sControlName
{
HWND hWnd;
int Length;
char Value[1];
};
#include <poppack.h>
void __fastcall TMyForm::WndProc(TMessage &Message)
{
if ((Message.Msg == WM_COPYDATA) && (WM_GETCONTROLNAME_RESULT != 0))
{
LPCOPYDATASTRUCT cds = (LPCOPYDATASTRUCT) Message.LParam;
if (cds->dwData == WM_GETCONTROLNAME_RESULT)
{
sControlName *pName = (sControlName*) cds->lpData;
AnsiString sName(pName->Value, pName->Length);
// locate pName->hWnd in your list and assign sName to it as needed...
return;
}
}
TForm::WndProc(Message);
}
void ___fastcall TMyForm::FillList()
{
...
if (WM_GETCONTROLNAME != 0)
{
HWND TheControlHWND = ...;
HWND OtherAppHWND = ...;
PostMessage(OtherAppHWND, WM_GETCONTROLNAME, (WPARAM)TheControlHWND, (LPARAM)this->Handle);
}
...
}
.
const UINT WM_GETCONTROLNAME = RegisterWindowMessage("WM_GetControlName");
const UINT WM_GETCONTROLNAME_RESULT = RegisterWindowMessage("WM_GetControlName_Result");
#include <pshpack1.h>
struct sControlName
{
HWND hWnd;
int Length;
char Value[1];
};
#include <poppack.h>
void __fastcall TMyForm::WndProc(TMessage &Message)
{
if ((Message.Msg == WM_GETCONTROLNAME) && (WM_GETCONTROLNAME != 0) && (WM_GETCONTROLNAME_RESULT != 0))
{
HWND hWnd = (HWND) Message.WParam;
TWinControl *Ctrl = FindControl(hWnd);
if (Ctrl)
{
AnsiString sName = Ctrl->Name;
std::vector<unsigned char> buffer((sizeof(sControlName) - 1) + sName.Length());
sControlName *pName = (sControlName*) &buffer[0];
pName->hWnd = hWnd;
pName->Length = sName.Length();
strncpy(pName->Value, sName.c_str(), pName->Length);
COPYDATASTRUCT cds = {0};
cds.dwData = WM_GETCONTROLNAME_RESULT;
cds.cdData = buffer.size();
cds.lpData = pName;
SendMessage((HWND)Message.LParam, WM_COPYDATA, (WPARAM)this->Handle, (LPARAM)&cds);
}
return;
}
TForm::WndProc(Message);
}