Безопасно ли изменять 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
значение вручную.