关于获取.net,winform应用程序主窗体问题

来源:互联网 发布:人工智能四大开放平台 编辑:程序博客网 时间:2024/06/10 17:06

1、主窗体定义:

就是在应用程序中通过application.run启动的第一个窗体

2、设想的解决方案:

(1)通过System.Diagnostics.Process().GetCurrentProcess().MainWindowHandle

和当前窗体的Handle进行比较,相等则为主窗体,否则不是。

这个方案的问题:

其一:如果子窗体是通过ShowDialog(),ShowDialog(this),Show(this)显示出来的时候,这个方法是可行的,

但是,一旦子窗体是通过Show()方法显示出来的,则这个方法就不在是Application.Run运行起来那个窗体了,

而是变成当前显示的窗体,也就是说System.Diagnostics.Process().GetCurrentProcess().MainWindowHandle

属性无法获取Show方式弹出窗体的主窗体句柄。

其二:这个方法看到msdn的例子,个人感觉更适合做运行外接程序时使用,并且,

仅当进程有图形界面时,该进程才具有与其关联的主窗口。如果关联进程没有主窗口,则 MainWindowHandle 值为零。如果刚启动了一个进程,并且想使用其主窗口句柄,则请考虑使用WaitForInputIdle 方法让该进程完成启动,从而确保创建了主窗口句柄。否则,将引发异常。

异常

异常类型条件

InvalidOperationException

未定义 MainWindowHandle,因为进程已退出。

NotSupportedException

试图检索在远程计算机上运行的进程的 MainWindowHandle

PlatformNotSupportedException

该平台为 Windows 98 或 Windows Millennium Edition (Windows Me);如果将 ProcessStartInfo.UseShellExecute 设置为 false,则可以在 Windows 98 和 Windows Me 上访问此属性。

(2)使用Application.OpenForms集合,

有人说OpenForms集合中OpenForms[0]为主窗体,即为 Application.Run(Form mainForm)启动的窗体,但是并没有在微软的官网上

查找到类似的说明。仅仅是说Application.Run启动的窗体会在启动时,自动注册窗体的Closed事件,在事件处理过程中调用ExitThread 方法仅此而已。

(3)在程序中定义主窗体引用定义,然后在主窗体被Run的地方对这个引用指向主窗体,这样做可以,但是如果我的程序是以插件的形式,原本是插件

是不需要知道主程序存在的,那么如果这样定义了,我就需要在插件中判断主程序的这个属性,这样插件就与主程序耦合了,所以也不是我想要的。


================================

目标:

找一种方法,可以利用平台提供的属性方法,直接获取到我Application.Run运行的窗体,而不需要在应用程序中自己额外定义这样类似的属性??