3

我有两个应用程序,第一个需要从第二个(也是我自己的)但不同的应用程序(不是实例,而是不同的应用程序)中找到表单的句柄。我见过一些技术,但我想知道我想做的事情是否安全,或者什么是有效的方法。

我正在考虑使用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为我想要的任何内容是否安全,或者在某些方面不安全?或者您将如何从您自己的另一个应用程序(不是应用程序实例,而是您自己的另一个应用程序)中查找表单句柄?

非常感谢!

4

2 回答 2

5

是的,这样做是完全安全的。当然,每个不同的类都必须有一个唯一的名称,但要确保是这种情况取决于您。

于 2012-05-23T09:48:29.550 回答
3

与其在两个应用程序中使用相同的类名,不如TForm1养成将默认类名更改为更有意义的名称的习惯,例如TApp1MainFormTApp2MainForm. 默认情况下, VCL 会自动分配一个表单ClassNameTCreateParams.WinClassNameTWinControl.CreateParams(). 如果您Name在设计时更改对象检查器中的表单属性,它会ClassName为您更新,那么您不必TCreateParams.WinClassName手动更改值。

于 2012-05-23T21:58:57.093 回答