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

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运行的窗体,而不需要在应用程序中自己额外定义这样类似的属性??


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值