Während der Lebensdauer eines .NET-Prozesses ändert der Handle von System.Windows.Forms.Form
, sagen wir einmal, das in Application.Run(form)
verwendete Hauptformular seinen Wert, d. h. wenn der Wert des Handles in einem anderen Prozess verwendet wird, z. IntPtr handle = User32.FindWindow(null, "Name")
, gibt es einen Fall, in dem dieses Handle möglicherweise von der .NET-Laufzeitumgebung ungültig gemacht wird?
BEARBEITEN
Ich muss die Handles kennen, weil ich SendMessage
und WM_COPYDATA
und ähnliches für IPC verwenden möchte.
Ein Fenster-Handle ist garantiert gültig und wird nicht wiederverwendet, solange das Fenster existiert. Es ist ein Index wie in der Natur, global gültig und verhält sich im Allgemeinen eher wie eine globale ID als wie ein Kernel-Handle (die nur in einem Prozess und Zeiger wie in der Natur gültig sind). Sobald das Fenster geschlossen wird, kann der Fenstergriff wiederverwendet werden und zeigt nun auf ein anderes Fenster.
Aber was nicht offensichtlich ist, ist, wenn die Lebensdauer von Form
und die zugrunde liegenden Fenster window
gleich sind. Ich erinnere mich vage daran, dass in Delphis VCL (Which ist der geistige Vorgänger von Windows.Forms) bestimmte Eigenschaftsänderungen das Fenster im Hintergrund neu erstellt haben.
Die Existenz der Control.RecreatingHandle Eigenschaft scheint wie ein starker Hinweis darauf, dass die Lebensdauer des zugrunde liegenden Fensters tatsächlich kürzer sein kann als die Lebensdauer des .net-Controls. Das könnte dazu führen, dass sich der Handle eines Form
während seiner Lebenszeit ändert.
Control.RecreateHandle
Die RecreateHandle-Methode wird immer dann aufgerufen, wenn Parameter für ein neues Steuerelement benötigt werden, ein Aufruf von UpdateStyles an CreateParams jedoch nicht ausreicht. Diese Methode ruft auch DestroyHandle und CreateHandle auf und legt RecreatingHandle auf true fest.
Ссылка
Aus der Beschreibung dieser Methode schließe ich, dass sich der Fenstergriff tatsächlich während der Lebensdauer des Formulars ändern kann.