C# 开机自启动和最小化托盘显示

一、      C# 开机自启动

C# 开机自启动,这个功能是大多数服务型软件很常用一个功能,但是这个功能确是不

太好做,花了两天想对策。不过最终呢,结果还是很满意的。

这个功能要达到的效果是这样的,所有用户开机自启动。

最初在网上找的资料都是修改注册表,基本上都是行如这样的:

//获取程序执行路径..

string starupPath = Application.ExecutablePath;
//class Micosoft.Win32.RegistryKey. 表示Window注册表中项级节点,此类是注册表装.
RegistryKey loca = Registry.LocalMachine;
RegistryKey run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
try
{
//SetValue:存储值的名称
  run.SetValue("qidong", starupPath);
  MessageBox.Show("已启用开机运行!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  loca.Close();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

结果我尝试的时候,发现根本就不行,在SetValue这块就出错了,报错的Message 是无访问权限,真的是折腾了很久,整UAC 权限之类的,最后还是放弃了,这种写法在XP 上还是可以成功的,因为XP 没有UAC权限的说法,而win7 这个权限砍绕不过去。

尝试第二种方法,通过注册服务,让服务启动界面程序,这种方式貌似是可以的,只不过我没有尝试成功。有兴趣的可以继续试试。

尝试第三种方法,就是将启动的界面程序快捷方式拷贝到启动目录下,这种方式确实可以达到效果,但是当时考虑到会不会只对当前用户有效,然后测试了下用另一账户登录,果然不行,这个时候,居然发现win7 下居然有一个所有用户的启动目录,哎只怪自己太年轻了。我把快捷方式放置在该目录下,居然正常运行。示例代码如下:

try
{ if (checkBoxReboot.Checked)
  { string StartupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonStartup);
     //获得文件的当前路径
     string dir = Directory.GetCurrentDirectory();
//获取可执行文件的全部路径
string exeDir = dir + @"\EcgNetPlug.exe.lnk";
System.IO.File.Copy(exeDir, StartupPath + @"\EcgNetPlug.exe.lnk", true);
}
else
{
string StartupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonStartup);
     System.IO.File.Delete(StartupPath + @"\EcgNetPlug.exe.lnk");
  }
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}

当然这种方式还是有点简单粗暴,比如有的用户想开机启动,有的用户又不想开机启动,那怎么办,其实这种我们可以通过配置文件和逻辑判断肯定是可以实现的。

二、      最小化托盘显示

这个我们要达到的效果是,启动时隐藏,双击托盘显示。

第一步:首先我们要创建一个空的winform 窗体。

第二步:向窗体拖动NotifyIcon 和 ContextMeauStrip 控件

第三步:最重要的一步,就是在NotifyIcon 属性中选择该ContextMeauStrip 控件,要不然右键NotifyIcon是出不来 菜单的。并且设置Icon 图标

第四步:给ContextMeauStrip 增加退出菜单,并且增加响应函数

 private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{ this.Close();
} 

第五步:让窗体初始化的时候隐藏

  private void Form1_Load(object sender, EventArgs e)
{
//隐藏窗体
this.WindowState = FormWindowState.Minimized;
}
private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Visible = false;
this.notifyIcon1.Visible = true;
}
}

第六步:给NotifyIcon 增加双击事件

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
this.Show();
}

第七步:这是会看到图标在任务栏还存在,设置ShowInTaskbar 属性为false.

第八步:大功告成。

代码地址 http://github.com/liningg/notifyicon.git

C# 开机自启动和最小化托盘显示的更多相关文章

  1. C# 实现最小化托盘功能

    winform程序实现最小化托盘显示 1.创建新的解决方案,解决方案名称和路径自定义 2.在解决方案下面新建一个窗体,从左边工具箱,将NotifyIcon拖过去窗体,该控件的作用是:运行程序期间在Wi ...

  2. Winform 最小化双击显示,最小化右键退出。退出

    WinForm 之 窗口最小化到托盘及右键图标显示菜单 Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下 ...

  3. windows vbs启动多个应用程序并使程序最小化(显示桌面)

      windows vbs启动多个应用程序并使程序最小化(显示桌面) CreationTime--2018年7月26日11点18分 Author:Marydon 1.应用场景 每天开机后,都需要打开平 ...

  4. QT:窗口最小化时显示一个小浮标

    有些窗口在自身最小化时要在桌面上显示一个小浮标,让用户利用这个小浮标进行各种操作(例如迅雷的悬浮窗一样),我试着用QT实现一下这个功能. PS:本来以为这个功能很简单,却搞了我两个晚上,泪奔... 思 ...

  5. Unity打包PC端各种屏幕适配,无边框,最小化,显示可拖拽部分

    using UnityEngine; using System.Collections; using UnityEngine.EventSystems; //using UnityEngine.Sce ...

  6. vim可视化&Linux系统安全最小化原则& su & sudo

    一.vim在可视化模式下编辑 crl+v,会变成-- VISUAL BLOCK --,然后用上下左右键去选中. 多行注释: ESC进入命令行模式; Ctrl+v进入VISUAL BLOCK模式 上下左 ...

  7. WinForm 之 窗口最小化到托盘及右键图标显示菜单

    Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下角,则需要给Form添加一个NotifyIcon控件. ...

  8. WinForm最小化到托盘以及托盘右键菜单

    首先,先拖一个NotifyIcon到主窗体,然后设置NotifyIcon的图标,不然等下最小化后,都找不到那个程序了,还有那个Text也是,不写名字,就默认是NotifyIcon了..如下图: 然后双 ...

  9. WPF实现窗口最小化到托盘,并且实现右击菜单

    原版是从网上找了一位大神的,自己只是用了一点适合自己的. 具体实现 1.首先已经确认WPF中没有实现最小化托盘的类与方法,用到了winform中的程序集 using Drawing = System. ...

随机推荐

  1. pdf文件之itextpdf插入html内容以及中文解决方案

    简述 目前网上已经有很多种html文件直接转pdf的技术帖子,但是很少有直接将部分html作为段落插入到pdf中,而且也没有一个可以很好的解决中文显示的问题. 因此今天上午围绕这个问题进行了研究,把解 ...

  2. Dagger2在Android开发中的应用

    世界是普遍联系的,任何事物和个体都直接或间接相互依赖,在时空长河中共同发展.在面向对象的世界中,更是如此,类与类之间的依赖,关联关系,模块(亦或是分层架构中的层)之间的耦合关系,都是我们在软件开发实践 ...

  3. http(一)web和网络基础

    深入学习http不为别的,只为补充底层知识,打好根基,深入了解其他技术,擒贼先擒王,学好九阳神功以后,乾坤大挪移,太极剑就容易了,急于求成,就只能变周芷若.走着...... 来源于:图解HTTP 1. ...

  4. 在两个ASP.NET页面之间传递变量【转】

    ASP.NET提供了事件驱动编程模型,使开发者简化了应用程序的总体设计,但是这个也造成了它固有的一些问题,例如,在传统的ASP里,我们可以通过使用POST方法很容易地实现页面间传递变量,同样的事情,在 ...

  5. tomcat+jdk+mysql

    转自 http://www.cnblogs.com/liulinghua90/ ,写的很详细,转来共享私藏 按照下面的步骤一步一步来搭建tomcat+jdk+mysql环境.   [Linux环境]- ...

  6. Cent-Linux腾讯课堂学习笔记

    RedHat yum系统下 防火墙 关闭防火墙方法 systemctl stop firewalld 检测防火墙状态 systemctl status firewalld 设置防火墙禁用开机启动 sy ...

  7. Javascript Prototype __proto__ constructor 三者的关系

    JavaScript三大毒瘤 --- this,原型链,作用域 在我等菜鸟一步一步升级中的过程中,这三个概念总是困扰这我们(可能只有我吧,我比较蠢).这三个东西往往都很绕,今天我就来分享一下我对原型. ...

  8. python基础(6):列表和字典类型

    前面我们所接触的数据类型都是存单个值,今天我们来看看可以存多个值的列表和字典. 预习: 1.有列表data=['alex',49,[1900,3,18]],分别取出列表中的名字,年龄,出生的年,月,日 ...

  9. lombok的简单介绍和使用方法

    这是上周在群里发现有人推荐lombok,他说是神器,当时就引起了我的好奇,然后下班回来我就看了看官网介绍(菜鸟英语水平),这就是难点了,然后就是大概了解了一下,就在网上查了查相关资料,周末的时候自己试 ...

  10. FreeRTOS——中断管理

    1. 只有以“FromISR”或"FROM_ISR"结束的API函数或宏才可以在中断服务函数中使用. 2. 除互斥信号量外,所有类型的信号量都可以调用 xSemaphoreTake ...