转自: http://blog.csdn.net/muf/archive/2006/04/13/661725.aspx
为了创建一个主窗口不显示的应用程序,我做了若干个探索。结果绕了几个弯,回到最简朴的没有窗体的世界中。
由此发现,我已经对窗体设计器产生了严重的依赖性,而且自已已经懒得不得了了--哪怕只有几行的代码,也要IDE自动生成。
我将探索过程,以及最后的解决,全部呈现出来,希望能对大家有点帮助。
2006-03-16 原文
2006-03-17 修订
2006-03-30 修订
2006-03-16 多云
一般在使用NotifyIcon时,都会有一个主窗口。当最小化或关闭主窗口后,可以从NotifyIcon再次显示主窗口。
这两天在写一个小程序时,想要一个没有窗口的桌面应用,它在工作时不需要窗口显示,顶多用BalloonTip显示一些提示信息。但是在实践中发现,NotifyIcon必须放在窗口中,窗口必须被创建才能显示NotifyIcon。
最初想的办法是在窗口建立时调用Hide或Visible=false,均不起作用;如果在Shown事件中Hide,则窗口会一闪而过,达不到要求。
看了一下Main函数:
Application.Run(new FormMain());
using (new FormMain())
Application.Run();
public static DialogResult DoDialog<T>(Form owner) where T : Form, new()
{
foreach (Form f in Application.OpenForms)
{
if (f.Modal)
{
f.BringToFront();
return DialogResult.None;
}
}
using (T dlg = new T())
return dlg.ShowDialog(owner);
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
DoDialog<AboutBox>(this);
}
public static void Run(Form mainForm)
{
Application.ThreadContext.FromCurrent().RunMessageLoop(-1, new ApplicationContext(mainForm));
} 
if (reason == -1)
{
if (this.applicationContext.MainForm != null)
{
this.applicationContext.MainForm.Visible = true;
}
}
protected override void SetVisibleCore(bool value){}
//或
protected override void SetVisibleCore(bool value)
{
base.SetVisibleCore(false);
} 
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
System.Resources.ResourceManager resources = new
System.Resources.ResourceManager("myResource",
System.Reflection.Assembly.GetExecutingAssembly());
NotifyIcon ni = new NotifyIcon();
ni.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Warning;
ni.BalloonTipText = "Hello world!";
ni.BalloonTipTitle = "Hi.";
//ni.ContextMenuStrip = contextMenu;
ni.Icon = ((System.Drawing.Icon)(resources.GetObject("ni.Icon")));
ni.Text = "Hello world!";
ni.Visible = true;
ni.MouseClick += delegate(object sender, MouseEventArgs e)
{
ni.ShowBalloonTip(0);
};
Application.Run();
} 2006-03-30 晴
1. 萧寒网友的方法
和SetVisibleCore一样简单,重写CreateParams属性方法可以实现:
protected override CreateParams CreateParams{
get{
Hide();
return base.CreateParams;
}
}
internal class HideOnStartupApplicationContext : ApplicationContext{
public HideOnStartupApplicationContext(Form mainForm){
mainForm.Closed += delegate(object sender, EventArgs e){
Application.Exit();
};
}
}
static void Main()
{
Application.Run(new HideOnStartupApplicationContext(new MainForm()));
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=661725