C# winform 开机自启动时最小化到托盘 单击显示窗体,右击显示菜单

拉一个NotifyIcon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标。

添加一个ContextMenuStrip控件,然后设置notifyIcon1的属性ContextMenuStrip为你添加的contextMenuStrip1

如果不想让程序在任务栏中显示,请把窗体的属性ShowInTaskbar设置为false

[csharp]  view plain  copy
  1.         //最小化事件,显示到托盘  
  2.         private void Form1_Resize(object sender, EventArgs e)  
  3.         {  
  4.             if (this.WindowState == FormWindowState.Minimized)  
  5.             {  
  6.                 this.Visible = false;   
  7.             }  
  8.         }  
  9.         //托盘图标单击显示  
  10.         private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)  
  11.         {  
  12.             this.Visible = true;  
  13.             this.TopMost = true;  
  14.             this.WindowState = FormWindowState.Normal;  
  15.             this.Activate();  
  16.         }  
  17.         //假关闭,关闭时隐藏  
  18.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  19.         {  
  20.             e.Cancel = true;  
  21.             this.Visible = false;  
  22.         }  

网上好多文章讲的开机自启动并最小化托盘好多都是假的,并没有实现开机启动的时候最小化

经过今天一番研究,经验分享:

设置注册表启动时多加一项 命令行 -s(注:这个内容由你自定义,-a -b -abc 都行)

[csharp]  view plain  copy
  1. //加入注册表启动项  
  2.             RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"true);  
  3.             if (key == null)  
  4.             {  
  5.                 key = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");  
  6.                 key.SetValue("xxx系统"this.GetType().Assembly.Location + " -s");  
  7.             }  
  8.             else  
  9.             {  
  10.                 key.SetValue("xxx系统"this.GetType().Assembly.Location + " -s");  
  11.             }  
  12.             key.Close();  

注册表效果如下

然后在program.cs中

[csharp]  view plain  copy
  1. ///   
  2.        /// 应用程序的主入口点。  
  3.        ///   
  4.        [STAThread]  
  5.        static void Main(String[] args)  //args获取启动命令行参数,传递给Form1  
  6.        {  
  7.            Application.EnableVisualStyles();  
  8.            Application.SetCompatibleTextRenderingDefault(false);  
  9.            Application.Run(new Form1(args));  
  10.        }  

然后Form1的load事件中判断 args,如果正常双击打开的话,是没有命令参数的,也就是args为空,此时让Form1显示,

如果是注册表开机启动的话,则args的值不为空,为命令行参数-s,此时应让Form1隐藏

代码如下:

[csharp]  view plain  copy
  1. String arg = null;  
  2.   
  3. public Form1(String[] args)  
  4. {  
  5.     if (args.Length > 0)  
  6.     {  
  7.         //获取启动时的命令行参数  
  8.         arg = args[0];  
  9.     }  
  10.     InitializeComponent();  
  11. }  
  12.   
  13. private void Form1_Load(object sender, EventArgs e)  
  14. {  
  15.     if (arg != null)  
  16.     {  
  17.         //arg不为空,说明有启动参数,是从注册表启动的,则直接最小化到托盘  
  18.         this.Visible = false;  
  19.         this.ShowInTaskbar = false;  
  20.     }  
  21. }  

以上代码本人亲测可用,请支持原创.!

你可能感兴趣的:(C#与asp.net,winform相关)