望程序启动时不显示主窗体,而只是在SystemTray显示一个图标;当用户点击该图标时,才第一次显示出主窗体来。

作者在文章中已经说得很清楚,将Form的Visible属性设置为false是不行的,因为在Application.Run方法的内部,主窗体的Visible属性将被强制设置为true。
此外,有朋友在回复中提供了“不启动任何窗体”的办法,即:

using (newMainForm())
{
Application.Run();
}

然后在NotifyIcon的Click事件中显示MainForm就可以了。
可以参考他的文章(http://ly4cn.cnblogs.com/archive/2006/03/16/351205.html)。

这个方法的确是解决了这个问题;但是由于切断了主窗体和Application之间的联系,因此必须使用Application.Exit来关闭程序。这样做仍然有些不自然,且有一些安全隐患;那么到底有没有更好的方法呢?

一个方法就是使用ApplicationContext。

ApplicationContext实质上就是一个Application与主窗体之间的连接器,掌管着二者之间的互动关系。
其中最主要的,就是负责在主窗体关闭时结束线程。既然如此,我们只要根据需要自定义一个ApplicationContext就可以了:

internal classHideOnStartupApplicationContext : ApplicationContext
{
privateForm mainFormInternal;

// 构造函数,主窗体被存储在mainFormInternal
publicHideOnStartupApplicationContext(Form mainForm)
{
this.mainFormInternal =mainForm;

this.mainFormInternal.Closed += newEventHandler(mainFormInternal_Closed);
}

// 当主窗体被关闭时,退出应用程序
void mainFormInternal_Closed(objectsender, EventArgs e)
{
Application.Exit();
}
}

随后,我们只需要在Main当中像下面这样调用既可:

static voidMain()
{
//...

HideOnStartupApplicationContext context = new HideOnStartupApplicationContext(newMainForm());
Application.Run(context);
}

这样,MainForm根本不用去考虑窗口与应用程序的关系,安安心心做它的“主窗口”就可以了。

此外,既然明白了ApplicationContext掌管着窗口结束与程序结束的关系,我们就可以用它来做出一些有趣的东西:
比如MSDN上就给出了一个“双主窗口”——同时显示2个Form,关闭其中任何一个都不会导致程序结束,只有全部关闭了才会结束程序。有兴趣的朋友可以参看MSDN关于ApplicationContext的资料,那里给出了详细的说明和范例代码。
再如,要设计一个“向导(Wizard)”类的程序,使用ApplicationContext也是最佳选择——它可以轻松控制Form到Form的流程,以及Form的启动与关闭,使得你的每个Form更加模块化,减少Form之间的依赖。

本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2010/01/05/1639905.html,如需转载请自行联系原作者 

WinForm程序启动时不显示主窗体的实现方法相关推荐

  1. C++ Builder 启动时不显示主窗体

    在网络上看到不少说法,但标准的做法应该是这样的. 首先,设置主窗体Visible属性为false; 然后,在Application->Run之前,设置Application->ShowMa ...

  2. WinForm 之 程序启动不显示主窗体

    在 WinForm 程序启动时,不显示主窗体的实现方法主要有以下5种,第五种最简单,而且效果也不错,第四种方法也值得推荐. 实例代码如下: //隐藏窗体的方法1/5:不指定任何窗体为主窗体 //注意: ...

  3. 2.实验室打卡精灵2.0-单实例化、开机启动、托盘操作、程序启动时隐藏主窗口

    老规矩,上一张图片 最近对实验室打卡精灵做了一些优化,基本上达到了最初设想的功能. 现在的功能包括: 1.自定义早上.中午.下午.晚上的打卡时间 2.软件单实例化,即如果已经运行了一次再次运行会弹出& ...

  4. 程序启动时,vc2015设置哪个窗体先打开,优先启动,设置方法

    程序启动时,vc2015设置哪个窗体先打开,设置方法 工程名对应的APP文件中 InitInstance中 //Caccess_mdb_operationDlg dlg;  //可以设置这里,首先启动 ...

  5. 把图形写入linux内核,如何在linux内核启动时添加显示图片

    内核版本为2.6.30.4 为了实现了在linux内核启动时不仅仅是只显示一个静态的全屏logo, 而是显示能够表示内核正在启动的进度条,因此需要能够在启动过程中直接操纵framebuffer的功能. ...

  6. linux 查看进程变量,Linux下查看进程(程序)启动时的环境变量

    Linux下查看进程(程序)启动时的环境变量 Linux的pargs ==================================== 今天又遇到一个老问题: 同事遇到了sqlplus &qu ...

  7. Winform MessageBox.Show时居中到主页面

    参考 (3条消息) .Net下Winform程序让MessageBox.Show显示在父窗体中间_aspnet2002web的博客-CSDN博客b 背景 最近winform项目不需要使用全屏显示了,还 ...

  8. linux c 启动程序吗,Linux下C程序启动时的系统调用

    写程序跟踪发现,在Linux i386中,一个程序体完全为空的C语言程序启动时要进行近100个系统调用,如下所示. [ 1]syscall: 11 //execve [ 2]syscall: 45 / ...

  9. VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题)

    VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题) 参考文章: (1)VC++ 实现VC程序启动时最小化到任务栏(完美解决闪烁问题) (2)https://www.cnblogs.com/ ...

最新文章

  1. 编程软件python怎样开始学-编程零基础应当如何开始学习 Python?
  2. 设计模式之委派模式及适配器模式
  3. Linux TCP 连接数修改
  4. python离群点检测_如何从熊猫DataFrame中检测峰点(离群值)
  5. 从开源视角分析,搞定边缘计算云原生方案选型
  6. 国内厂商 Onyx 违反 GPL 协议,中国开源何去何从?
  7. Aruba发布业界首款服务智能边缘的云原生平台Aruba ESP
  8. Linux环境_源码安装LibreOffice实现文件在线预览doc,doxc,xls,xlsx,ppt,pptx 文件
  9. CodeIgniter辅助函数
  10. 编译原理pl/0 c语言版 pl0.h文件
  11. 我的docker随笔9:docker在centos上的安装
  12. Siebel Admin: How to find the Component that associated with Application
  13. 机构借贷平台 Maple 将上线以太坊主网并开启流动性挖矿
  14. PHP PDF转图片:设置图像的色彩空间 RGBCMYK互转
  15. chrome谷歌浏览器 离线安装包下载64位
  16. 腾讯电子签小程序就能开收据了
  17. fqa什么意思_FQA是啥意思
  18. 设计模式——访问者模式
  19. 京东云主机 mysql_京东云所有地域正式支持 MySQL 8.0!
  20. 天梯赛L1(1-80)

热门文章

  1. cookie知识总结
  2. postman 字符串中有冒号_【接口测试】Postman入门09 Postman获取HTTP请求
  3. 多线程跑调度_java多线程中的调度策略
  4. SSL/TLS 工具 OpenSSL
  5. Java Portlets 介绍
  6. 保益悦听怎么开盲人模式_夏天空调开26度,宝宝最舒适?错!夏季空调怎么开,你来听我说...
  7. 使用计算机控制台方法,故障控制台使用方法
  8. linux恢复fat文件系统,使用‘fsck’修复Linux中文件系统错误的方法
  9. CodeForces - 589D
  10. 一般判五年几年能出来_A股十年不涨的“元凶”被揪了出来,指数不该被冤枉...