8

.NET プロセスの存続期間中に、 のハンドルを実行しSystem.Windows.Forms.Formます。使用されるメイン フォームがApplication.Run(form)実際にその値を変更するとします。つまり、別のプロセスでハンドルの値を使用する場合、たとえばIntPtr handle = User32.FindWindow(null, "Name")、そのハンドルが.NET ランタイムによって無効にされますか?

編集

SendMessage等々WM_COPYDATAをIPCで使いたいのでハンドルを知りたいです。

4

1 に答える 1

11

ウィンドウ ハンドルは有効であることが保証されており、ウィンドウが存続している限り再利用されません。これは本質的にインデックスのようなものであり、グローバルに有効であり、一般にカーネル ハンドルよりもグローバル ID のように動作します (これは本質的に 1 つのプロセスとポインターでのみ有効です)。ウィンドウが閉じられると、ウィンドウ ハンドルが再利用される可能性があり、別のウィンドウを指すようになります。

しかし、明らかではないのは、Formとその下にあるウィンドウの寿命がwindow同じかどうかです。Delphi の VCL (Windows.Forms の精神的な前身) では、特定のプロパティの変更により、バックグラウンドでウィンドウが再作成されたことを漠然と覚えています。

Control.RecreatingHandleプロパティの存在は、基になるウィンドウの有効期間が .net コントロールの有効期間よりも実際に短い可能性があることを強く示しているようです。Formこれは、その存続期間中に変更のハンドルにつながる可能性があります。

Control.RecreateHandle
RecreateHandle メソッドは、新しいコントロールにパラメーターが必要なときに呼び出されますが、UpdateStyles から CreateParams への呼び出しを使用するだけでは不十分です。このメソッドは、DestroyHandle と CreateHandle も呼び出し、RecreatingHandle を true に設定します。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.recreatehandle.aspx

このメソッドの説明から、フォームの有効期間中にウィンドウ ハンドルが実際に変更される可能性があると結論付けています。

于 2011-07-21T07:55:45.637 に答える