8

在 .NET 进程的生命周期中,a 的句柄System.Windows.Forms.Form,比如说用于Application.Run(form)实际改变它的值的主要形式,即如果在不同的进程中使用句柄的值,例如IntPtr handle = User32.FindWindow(null, "Name"),是否存在该句柄可能被.NET 运行时失效?

编辑

我需要知道句柄,因为我想为 IPC使用SendMessage等。WM_COPYDATA

4

1 回答 1

11

只要窗口存在,窗口句柄就保证是有效的并且不会被重用。它本质上是索引,全局有效,并且通常表现得更像全局 ID,而不是内核句柄(仅在一个进程中有效,指针本质上是一样的)。一旦窗口关闭,窗口句柄可能会被重用,现在指向另一个窗口。

但是不明显的是,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 回答