Безопасно ли изменять TCreateParams.WinClassName или как найти дескриптор формы другого собственного приложения?

У меня есть два приложения, где первое должно найти дескриптор формы от второго (также моего собственного), но другое приложение (не экземпляр, а другое приложение). Я видел некоторые методы, но я хотел бы знать, безопасно ли то, что я хотел бы сделать, или какой эффективный способ сделать это.

Я думал о том, чтобы использовать FindWindow функция, где вы можете передать имя класса, так что если я бы изменить WinClassName член в CreateParams формы с некоторым уникальным значением (например, GUID), тогда я довольно легко смогу найти это окно с большой вероятностью, что оно из моего приложения.

Приложение, форму которого нужно найти:

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WinClassName := '{1EE65C52-2F4B-4600-AAE2-079C29AD2220}';
end;

Другое приложение, которому нужно найти форму из предыдущего:

procedure TForm1.Button1Click(Sender: TObject);
var
  FormHandle: HWND;
begin
  FormHandle := FindWindow('{1EE65C52-2F4B-4600-AAE2-079C29AD2220}', nil);
  ShowMessage(IntToStr(FormHandle));
end;

Мой вопрос:

Безопасно ли менять этого члена TCreateParams что я хочу или это небезопасно в чем-то? Или как вы будете искать дескриптор формы из вашего собственного другого приложения (не экземпляра приложения, а вашего собственного другого приложения)?

Большое спасибо!

2 ответа

Решение

Да, это совершенно безопасно. Естественно, каждый отдельный класс должен иметь уникальное имя, но вы должны убедиться, что это так.

Вместо того, чтобы использовать тот же TForm1 имя класса в обоих приложениях, вы должны привыкнуть менять имена классов по умолчанию на более значимые имена, такие как TApp1MainForm а также TApp2MainForm, VCL автоматически назначает форму ClassName как его TCreateParams.WinClassName по умолчанию в TWinControl.CreateParams(), Если вы измените форму Name свойство в Инспекторе объектов во время разработки, оно обновляет ClassName для вас, то вам не нужно менять TCreateParams.WinClassName значение вручную.

Другие вопросы по тегам