在.NET进程的生命周期中,System.Windows.Forms.Form
的句柄是否可以说Application.Run(form)
中使用的主表单实际上改变了它的值,即如果使用了句柄的值不同的过程,例如IntPtr handle = User32.FindWindow(null, "Name")
,是否存在.NET运行时可能使该句柄无效的情况?
修改
我需要知道句柄,因为我想对IPC使用SendMessage
和WM_COPYDATA
等。
答案 0 :(得分:9)
窗口句柄保证有效,并且只要窗口存在就不会重复使用。它本质上是索引,全局有效,并且通常表现得像一个全局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
从这个方法的描述中我得出结论,窗口句柄确实可以在表单的生命周期内改变。