3

私には2つのアプリケーションがあり、最初のアプリケーションは2番目のアプリケーション(これも私自身のもの)からフォームのハンドルを見つける必要がありますが、異なるアプリケーション(インスタンスではなく、異なるアプリケーション)です。私はいくつかのテクニックを見てきましたが、私がやりたいことが安全かどうか、またはこれを行うための効率的な方法は何かを知りたいです。

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クラス名を使用するのではなく、デフォルトのクラス名をやなどのより意味のある名前に変更する習慣を身に付ける必要がありTApp1MainFormますTApp2MainForm。VCLは、デフォルトでフォームClassNameを自動的に割り当てます。設計時にオブジェクトインスペクターでフォームのプロパティを変更すると、フォームが自動的に更新されるため、値を手動で変更する必要はありません。TCreateParams.WinClassNameTWinControl.CreateParams()NameClassNameTCreateParams.WinClassName

于 2012-05-23T21:58:57.093 に答える