.Net程序随系统开机启动(仿Foxmail托盘效果控制)

对于使.NET程序随系统开机启动,最常用的可能就是向在注册表中注册开机启动项,或是建立Windows服务,使程序随系统启动而启动。
这里以WinForm程序为例,测试Demo分享,同时附上对于程序托盘的简单操作,仿Foxmail的托盘显示效果,好的产品都是细细打磨出来的呀!

1.WinForm程序添加注册表和移除注册表
(1).创建一个WinForm程序,界面如下(很简单):

(2).主要实现代码:(注册表开机启动位置:SOFTWARE\Microsoft\Windows\CurrentVersion\Run)


  /// <summary>
/// 根据注册名称和路径判断是否已注册
/// </summary>
/// <param name="regName">注册名称</param>
/// <param name="startUpPath">注册路径</param>
private void IsExistsStartRun(string regName, string startUpPath)
{
string strMessage = "注册已移除!";
RegistryKey loca = Registry.LocalMachine;
RegistryKey run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");

object obj = run.GetValue(regName);

if (obj != null)
{
strMessage = "注册已添加!";
ControlBtnEnable(false);
}
else
{
ControlBtnEnable(true);
}
lblInitMsg.Text += strMessage;
}

/// <summary>
/// 根据注册名和注册路径,更新注册表信息
/// </summary>
/// <param name="regName">注册名</param>
/// <param name="startUpPath">注册路径</param>
/// <param name="isAddReg">是否添加</param>
private void RegCompStartRun(string regName, string startUpPath, bool isAddReg)
{
//表示Window注册表中项级节点,读取 Windows 注册表基项HKEY_LOCAL_MACHINE
RegistryKey localMachine = Registry.LocalMachine;
RegistryKey run = localMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");

try
{
//SetValue:存储值的名称
if (isAddReg)
{
run.SetValue(regName, startUpPath);//加入注册,参数一为注册节点名称(随意)
}
else
{
if (run.GetValue(regName) != null)//存在则移除
{
run.DeleteValue(regName, false);//删除该注册节点
}
}
localMachine.Close();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

重新将改程序注册到注册表中,重启电脑,应该就可以了。博客最后是完整代码实现。
2.程序托盘显示控制
(1).在WinForm程序控件库找到notifyIcon控件,将其加到WinForm程序上面,仿Foxmail的托盘程序控制。
随系统自动启动,最小化为托盘在底部显示;单击托盘图标,显示主体程序,继续单击显示和隐藏;单击主窗体关闭按钮,放到托盘显示,右键退出系统,关闭主体程序。
(2).主要实现代码:


 /// <summary>
/// 初始化消息图标的右键菜单
/// </summary>
private void InitNotifyicon()
{
List<MenuItem> listMenu = new List<MenuItem>();
listMenu.Add(new MenuItem("显示主窗口", new EventHandler(this.notifyIcon_ShowFrm)));
listMenu.Add(new MenuItem("-"));
listMenu.Add(new MenuItem("最小化系统", new EventHandler(this.notifyIcon_Minimzed)));
listMenu.Add(new MenuItem("-"));
listMenu.Add(new MenuItem("退出系统", new EventHandler(this.notifyIcon_ExitShow)));

this.notifyIcon1.ContextMenu = new ContextMenu(listMenu.ToArray());//消息托盘菜单
}

/// <summary>
/// 根据是否显示窗体和是否最小化,控制窗体显示
/// </summary>
/// <param name="isFrmShow">是否显示主窗体</param>
/// <param name="isMinShow">是否为最小化</param>
private void IsShowMainFrm(bool isFrmShow, bool isMinShow)
{
if (!isMinShow)
{
this.Visible = isFrmShow;//显示在屏幕
this.ShowInTaskbar = isFrmShow;//显示在任务栏
this.WindowState = FormWindowState.Normal;
isShowFrm = !isFrmShow;//相反设置
}
else
{
this.Visible = isMinShow;//主窗体可见
this.ShowInTaskbar = isMinShow;//在任务栏显示
isShowFrm = !isFrmShow;//是否显示主窗体控制
this.WindowState = isFrmShow == true ? FormWindowState.Normal : FormWindowState.Minimized;
}
this.isShowMin = isMinShow;//显示最小化控制
}

3.结合对注册表的操作实现随着系统启动自动启动程序;默认显示为托盘图标显示在底部以及一些显示隐藏控制,仿Foxmail的完成代码实现:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;

namespace WinFormAutoStart
{
public partial class Form1 : Form
{
private bool isShowMin = false;//默认为最小化
private bool isShowFrm = false;//默认不显示主窗体
private string regName = "TestWinForm";//注册表对应的Name
private string startUpPath = Application.ExecutablePath;//程序执行路径

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
//注册表操作
IsExistsStartRun(regName, startUpPath);

//托盘消息操作
this.Visible = false;//不可见
this.ShowInTaskbar = false;//不显示在系统任务S栏
this.notifyIcon1.Visible = true;
InitNotifyicon();//添加消息图标右键菜单
}

#region 注册表相关操作
/// <summary>
/// 控制按钮是否可用
/// </summary>
/// <param name="isAdd">标识是否为添加注册操作</param>
private void ControlBtnEnable(bool isAdd)
{
if (isAdd)
{
this.btnAddReg.Enabled = true;
this.btnDeleteReg.Enabled = false;
}
else
{
this.btnAddReg.Enabled = false;
this.btnDeleteReg.Enabled = true;
}
}

/// <summary>
/// 根据注册名称和路径判断是否已注册
/// </summary>
/// <param name="regName">注册名称</param>
/// <param name="startUpPath">注册路径</param>
private void IsExistsStartRun(string regName, string startUpPath)
{
string strMessage = "注册已移除!";
RegistryKey loca = Registry.LocalMachine;
RegistryKey run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");

object obj = run.GetValue(regName);

if (obj != null)
{
strMessage = "注册已添加!";
ControlBtnEnable(false);
}
else
{
ControlBtnEnable(true);
}
lblInitMsg.Text += strMessage;
}

/// <summary>
/// 根据注册名和注册路径,更新注册表信息
/// </summary>
/// <param name="regName">注册名</param>
/// <param name="startUpPath">注册路径</param>
/// <param name="isAddReg">是否添加</param>
private void RegCompStartRun(string regName, string startUpPath, bool isAddReg)
{
//表示Window注册表中项级节点,读取 Windows 注册表基项HKEY_LOCAL_MACHINE
RegistryKey localMachine = Registry.LocalMachine;
RegistryKey run = localMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");

try
{
//SetValue:存储值的名称
if (isAddReg)
{
run.SetValue(regName, startUpPath);//加入注册,参数一为注册节点名称(随意)
}
else
{
if (run.GetValue(regName) != null)//存在则移除
{
run.DeleteValue(regName, false);//删除该注册节点
}
}
localMachine.Close();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

/// <summary>
/// 添加到注册表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAddReg_Click(object sender, EventArgs e)
{
//注册 WinForm程序开机启动
string strMessage = "添加程序注册成功!";
RegCompStartRun(regName, startUpPath, true);
lblMessage.Text = strMessage;
ControlBtnEnable(false);
MessageBox.Show(strMessage);
}

/// <summary>
/// 从注册表移除
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDeleteReg_Click(object sender, EventArgs e)
{
//注册 WinForm程序开机启动
string strMessage = "移除程序注册成功!";
RegCompStartRun(regName, startUpPath, false);
lblMessage.Text = strMessage;
ControlBtnEnable(true);
MessageBox.Show(strMessage);
}
#endregion

#region 消息图标相关操作
/// <summary>
/// 初始化消息图标的右键菜单
/// </summary>
private void InitNotifyicon()
{
List<MenuItem> listMenu = new List<MenuItem>();
listMenu.Add(new MenuItem("显示主窗口", new EventHandler(this.notifyIcon_ShowFrm)));
listMenu.Add(new MenuItem("-"));
listMenu.Add(new MenuItem("最小化系统", new EventHandler(this.notifyIcon_Minimzed)));
listMenu.Add(new MenuItem("-"));
listMenu.Add(new MenuItem("退出系统", new EventHandler(this.notifyIcon_ExitShow)));

this.notifyIcon1.ContextMenu = new ContextMenu(listMenu.ToArray());//消息托盘菜单
}

/// <summary>
/// 根据是否显示窗体和是否最小化,控制窗体显示
/// </summary>
/// <param name="isFrmShow">是否显示主窗体</param>
/// <param name="isMinShow">是否为最小化</param>
private void IsShowMainFrm(bool isFrmShow, bool isMinShow)
{
if (!isMinShow)
{
this.Visible = isFrmShow;//显示在屏幕
this.ShowInTaskbar = isFrmShow;//显示在任务栏
this.WindowState = FormWindowState.Normal;
isShowFrm = !isFrmShow;//相反设置
}
else
{
this.Visible = isMinShow;//主窗体可见
this.ShowInTaskbar = isMinShow;//在任务栏显示
isShowFrm = !isFrmShow;//是否显示主窗体控制
this.WindowState = isFrmShow == true ? FormWindowState.Normal : FormWindowState.Minimized;
}
this.isShowMin = isMinShow;//显示最小化控制
}

/// <summary>
/// 右键菜单显示主窗体事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon_ShowFrm(object sender, System.EventArgs e)
{
IsShowMainFrm(true, false);
}

/// <summary>
/// 右键菜单退出系统事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon_ExitShow(object sender, EventArgs e)
{
notifyIcon1.Visible = false;//图标可不见
notifyIcon1.Dispose();
this.Close();//关闭窗体
this.Dispose();//释放资源
}

/// <summary>
/// 右键菜单最小化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon_Minimzed(object sender, EventArgs e)
{
IsShowMainFrm(false, true);
}

/// <summary>
/// 监视窗体大小改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
IsShowMainFrm(false, true);
}
}

/// <summary>
/// 窗体正在关闭事件
/// 自动放置到托盘
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
IsShowMainFrm(false, false);
e.Cancel = true;//取消关闭操作
}

/// <summary>
/// 消息点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
IsShowMainFrm(isShowFrm, isShowMin);//控制主窗体是否显示
}
#endregion
}
}

4.效果图如下:

.Net程序随系统开机启动(仿Foxmail托盘效果控制)

时间: 2024-10-18 20:29:05

.Net程序随系统开机启动(仿Foxmail托盘效果控制)的相关文章

Linux系统开机启动时的工作原理

Linux系统开机启动时的工作原理也是深入了解Linux系统核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘信息.内存信息.时钟信息.PnP特性等等.在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了.在BIOS将系统的控制权交给硬盘第一个扇区之后,就开始由Linux来控制系统了. 启动第二步--读取MB

Linux系统开机启动原理

我理解的linux系统开机顺序如下,如有分歧,可一起探讨. Linux系统开机启动的顺序是: BIOS自检,检查硬件,选择引导介质如光盘or硬盘orU盘等等. 进入bootloader,它是写在硬盘最前面的部分,大小是512字节.由446字节的mbr和64字节的DPT和2字节的返回码组成. bootloader会去读取/boot/grub/grub.conf,然后根据配置文件寻找/boot分区下面的内核文件vmlinuz.....及内核辅助文件initrd......以及加载根分区 读取/etc

如何避免windows系统开机启动每次都弹出AutoIt报错

题目:如何避免windows系统开机启动每次都弹出AutoIt报错 有时候,有的电脑重新安装完操作系统后,会莫名奇妙的弹出一些意想不到的报错,有洁癖的人很反感这个,所以有针对性的解决这个算不上问题的小问题 电脑开机后会弹出以下的对话框: 解决办法如下: 原文地址:http://blog.51cto.com/vbers/2114661

LINUX系统开机启动流程全解

1,linux系统6.0系列和7.0系列系统开机启动流程:简述:1,开机BIOS自检2,MBR引导(磁盘上的一个引导扇区512K)3,grub引导菜单(可进入单用户模式或者救援模式)4,加载Kernel内核5,启动init进程(6系列的第一个进程7系列的第一个进程是systemd6,读取initab启动文件执行rc.sysinit等开机启动脚本文件7,启动mingetty,启动系统登录界面 原文地址:https://blog.51cto.com/13858002/2429553

利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果

利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果/etc/init.d/nginxd {start/stop/restart/reload}利用if语句实现: =========================================================== 实现特殊颜色实现效果: vim start_nginx.sh [root@lamp01 scripts]# cat bqh_nginx_startup.sh #!/bin/sh . /etc/init.d/

Linux系统开机启动流程介绍

一.linux系统进程启动流程图: 二.简单概括描述linux系统从开机到登陆界面的启动过程 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核 5.启动init进程 6.读取inittab文件执行rc.sysinit.rc等脚本 7.启动mingetty进入系统登录界面 三.详细剖析linux系统启动过程 1.POST开机自检 电脑主机打开电源的时候随后会听到滴的一声响系统启动开始了开机自检POST-power on self Test自检开始这个过程中主要是检测计算机硬

linux系统开机启动过程

Linux系统开机过程 1:BIOS 通电自检 2:读取MBR 3:boot loader 4:加载内核 5:用户层init根据inittab文件来设定运行等级 6:init进程执行rc.sysinit 7:启动内核模块 8:执行不同运行级别的脚本程序 9:执行/etc/rc/d/rc.local 10:执行/bin/login 程序,进入登录状态.

Android系统开机启动画面显示过程简要说明

开机启动会显示三个画面: Linux内核的启动画面,静态画面 Init进程启动过程中出现的静态画面 系统服务启动过程中出现的动态画面 这些画面的显示的过程不同,但最终是通过framebuffer显示的,每层对它显示的过程进行了封装.即无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的. Framebuffer是对硬件显示设备的抽象,屏蔽底层不同的显示设备.对framebuffer上进行写操作即可得到对应的画面. 第一个启动画面:显示一只企鹅

如何把自己写的程序加入到开机启动项(Windows)

①autoexec.bat ②winstart.bat  它的功能跟autoexec.bat的功能是一样的 ③开始菜单"启动"栏  在Windows完成启动后启动的栏目,由于windows已经完全启动,所以可以利用它来完成功能,你想要完成什么启动项目就只用把快捷方式拖到: C:\WINDOWS\Start Menu\Programs\启动 中就可以了 ④注册表的分支  HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersio