.NET中的窗口句柄可以改变它的价值吗?

时间:2011-07-21 07:25:38

标签: .net windows winapi handle intptr

在.NET进程的生命周期中,System.Windows.Forms.Form的句柄是否可以说Application.Run(form)中使用的主表单实际上改变了它的值,即如果使用了句柄的值不同的过程,例如IntPtr handle = User32.FindWindow(null, "Name"),是否存在.NET运行时可能使该句柄无效的情况?

修改

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

1 个答案:

答案 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

从这个方法的描述中我得出结论,窗口句柄确实可以在表单的生命周期内改变。