苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

分布式系统框架(V1.3) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper万能框架(V2.3-含.netcore) HttpHelper官方出品,无敌框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 最牛的爬虫类,没有爬不到只有想不到 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 27733|回复: 12

[Winform] c#实现开机自启动

[复制链接]
发表于 2012-11-13 13:41:08 | 显示全部楼层 |阅读模式
winform程序中  如何添加代码,让软件在开机后自启动???        
看下面方法
写注册表的方法
[C#] 纯文本查看 复制代码
RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);//打开注册表子项  
key.SetValue(程序的名称, 程序的路径);
或
WshShell shell = new WshShell();   
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutPath);

下面提供一个函数
开机自动启动程序的函数:
[C#] 纯文本查看 复制代码
public void SetAutoRun(string fileName, bool isAutoRun)  
{  
    RegistryKey reg = null;  
    try  
    {  
        if (!System.IO.File.Exists(fileName))  
            throw new Exception("该文件不存在!");  
        String name = fileName.Substring(fileName.LastIndexOf(@"\") + 1);  
        reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);  
        if (reg == null)  
            reg = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");  
        if (isAutoRun)  
            reg.SetValue(name, fileName);  
        else  
            reg.SetValue(name, false);  
        lbl_autorunerr.Visible = false;  
    }  
    catch  
    {  
        lbl_autorunerr.Visible = true;  
        //throw new Exception(ex.ToString());  
    }  
    finally  
    {  
        if (reg != null)  
            reg.Close();  
    }  
}  

使用的时候,直接调用SetAutoRun函数即可,这里解释一下两个参数的含义:
fileName:需要设置自动启动程序的路径,若为当前程序可直接传递Application.ExecutablePath。
isAutoRun:是否自动运行,为false时,取消自动运行。
例:  SetAutoRun(Application.ExecutablePath, true);  //设置自动启动当前程序
      SetAutoRun(Application.ExecutablePath, false);  //取消自动启动

或者是生成一个快捷方式文件,写到 开始,程序,启动对应的目录下面,这样的方法也是可以的。但是没有注册来的实在
发表于 2012-12-26 16:18:04 | 显示全部楼层
楼主分享的不错,
不过有2点需要注意的:
1、通过注册表添加开机启动项,在xp上可以,但在win7 8上面,因为有UAC,所以会提示操作失败,具体是哪个提示我忘了。
2、关于WshShell 对象,我没试过添加开机启动,只用过些对象来创建快捷方式。若要使用此方法,记得添加引用COM组件:Windows Script Host Object Model。
还有一种较常用添加开机启动项的方式:添加到“启动”文件夹里。很多程序都用这种方式。
其实添加开机启动方式相当多,仅注册表就有好几个位置可以添加,还可以添加到系统盘文件里面。具体可以查找木马或病毒如何设置开机启动~~~
 楼主| 发表于 2012-12-26 16:21:08 | 显示全部楼层
剪刀手 发表于 2012-12-26 16:18
楼主分享的不错,
不过有2点需要注意的:
1、通过注册表添加开机启动项,在xp上可以,但在win7 8上面,因 ...

写这个程序的时候Win7还没有出来呢?呵呵
发表于 2012-12-26 16:28:58 | 显示全部楼层
admin 发表于 2012-12-26 16:21
写这个程序的时候Win7还没有出来呢?呵呵

呵呵,楼主好强大……膜拜中……
发表于 2013-3-18 13:38:11 | 显示全部楼层
剪刀手 发表于 2012-12-26 16:18
楼主分享的不错,
不过有2点需要注意的:
1、通过注册表添加开机启动项,在xp上可以,但在win7 8上面,因 ...

刚刚试过了,在win7里使用站长的方法是可以成功操作的,重启了两三次都是自动启动任务的,至于win8,因为没有操作系统,还没尝试。
发表于 2013-7-6 13:20:10 | 显示全部楼层
发表于 2013-7-7 19:27:26 | 显示全部楼层
   //修改开机自动启动
            try
            {
                 RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\microsoft\windows\currentversion\run", true);
            if (key != null) key.SetValue("WindowsFormsApplication1.exe", Application.ExecutablePath);
            MessageBox.Show("开机启动成功!", "提示");
            key.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

//取消开机自动启动
            try
            {
                 RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\microsoft\windows\currentversion\run", true);
                 object obj = key.GetValue("WindowsFormsApplication1.exe");
                 //if (key.GetValue("WindowsFormsApplication1.exe").ToString().Length>0)
                 if (obj != null)
                 {
                     key.DeleteValue("WindowsFormsApplication1.exe");
                     MessageBox.Show("取消开机启动成功!", "提示");
                 }
                 else
                 {
                     MessageBox.Show("点击次数过多!");
                 }
                 key.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

win7 上我就写这样、没多大区别吧
发表于 2015-8-20 19:35:01 | 显示全部楼层
带命令行的自启动怎么实现呢。我需要传入参数给From1,来判断程序是自启还是手动双击启动的。来实现,如果是自启动的话,就自动最小化Form1. 如果不是的话,就正常模式弹出Form1.

static void Main(string[] args)   
{               
                        bool ret;
                        System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out ret);
                        if (ret)
                        {
                                Application.EnableVisualStyles();
                                System.Windows.Forms.Application.DoEvents();           
                                if (args.Length == 1)
                                        Application.Run(new Form1(args[0]));//如果有参数则传入
                               
                                else Application.Run(new Form1());  
                                mutex.ReleaseMutex();
                        }
。。。。。。。。。。。。。。。
}
我在VS中设置的命令行参数
命令行参数.jpg
注册表添加自启动,路径里面我这样子写的:
2015-08-20_193044.jpg
实际注册表中的效果是:
注册表启动项参数.jpg
但经过测试,重启了windows,程序成功启动了,为何没有参数传入呢。
按道理单步调试的时候是有值进来了的。还是说我得自启动应该用cmd命令行的形式启动?直接添加入注册表这种模式是错误的?
有值传进来了.jpg

发表于 2016-6-24 12:01:50 | 显示全部楼层
回复

使用道具 举报

发表于 2019-10-4 14:07:37 | 显示全部楼层
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备17001017号-1)

GMT+8, 2019-10-21 18:30

© 2017-2018

快速回复 返回顶部 返回列表