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

Seb*_*ian 8 .net windows winapi handle intptr

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

编辑

我需要知道的把手,因为我想用SendMessageWM_COPYDATA等以IPC.

Cod*_*aos 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

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

  • @Sebastian:当然,这些句柄可以从.NET获得.我的观点是,只要你需要它们,就应该从控件的`Handle`属性中检索它们,而不是试图在自己的某个地方"存储"`IntPtr`变量中的句柄.保持对控件类的引用,而不是句柄. (2认同)
  • @Sebastian:好的,公平的.我会添加一些调试时断言来验证窗口句柄是否有效.正如我们所讨论的那样,唯一会导致Windows重新创建窗口(为其分配新句柄)的是您更改该窗口的属性或样式.这意味着你可以在调试时轻松捕获它,如果没有触发断言,你知道在发布应用程序时你会没事的.检查P /调用[`IsWindow`函数](http://msdn.microsoft.com/en-us/library/ms633528.aspx)以在断言中执行此验证. (2认同)