C# Winform打包部署时添加注册表信息实现开机自启动

1.原理:需要开机自启动的程序,需要将其启动程序的路径写到注册表中指定的文件夹下

2. 写入注册表的方式有两种

a.在生成安装程序时配置

b.在程序运行时,动态配置

方法一:使用VS2010自带的打包模块可以很方便的对项目进行打包部署,同时我们也可以在安装部署时操作注册表实现开机启动软件。具体实现如下:

1、添加安装部署项目后,鼠标右键安装项目->视图->注册表,HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run中 添加键值保存软件目录。
    注意:默认的可能只有HKEY_CURRENT_USER\Software\[Manufacturer],没关系,我们依次添加以上的项即可,通过右键菜单新建"键",创建出如图所示的路径。即:HKEY_CURRENT_USER\Software\[Manufacturer]\Windows\CurrentVersion\Run。

2、然后在Run中添加字符串值,键名可以自己起,value要填软件的物理路径。
    物理路径是客户在部署确定的,我们如何获取呢?这里我们可以使用[TARGETDIR]获取客户选择的路径,在加上软件的启动文件名称。比如软件启动文件的名称是xx.exe,那么Value的值就为:[TARGETDIR]xx.exe。

这样,重启电脑系统就会自动运行我们设置的软件。

方法一本人亲测成功。

自启动成功后遇到的其他问题:安装后用鼠标点击打开可以正常运行,开机也可以自动启动,但是它读取配置文件数据(存在需要读取程序里面相关的配置文件)时出错,我关闭它用鼠标打开又可以正常运行

解决方法:开机时系统有很多内容没加载完全,软件就启动程序了,所以开机启动时不能找到那个配置文件。我直接将读取数据的路径改为 Application.StartupPath+配置文件路径就解决了 ,或者设置一个延时,延迟读取配置文件的时间。

public static string filePath = Application.StartupPath + @".\文件夹\文件名.bmp";//系统的filePath的路径

方法二:在程序运行时指定是否开机启动

  在程序运行时,通过调用如下方法实现开机启动

1 1 /// <summary> 2 2 /// 修改程序在注册表中的键值 3 3 /// </summary> 4 4 /// <param name="isAuto">true:开机启动,false:不开机自启</param> 5 5 public static void AutoStart(bool isAuto) 6 6 { 7 7 try 8 8 { 9 9 if (isAuto == true) 1010 { 1111 RegistryKey R_local = Registry.LocalMachine;//RegistryKey R_local = Registry.CurrentUser; 1212 RegistryKey R_run = R_local.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 1313 R_run.SetValue("应用名称", Application.ExecutablePath); 1414 R_run.Close(); 1515 R_local.Close(); 1616 } 1717 else 1818 { 1919 RegistryKey R_local = Registry.LocalMachine;//RegistryKey R_local = Registry.CurrentUser; 2020 RegistryKey R_run = R_local.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 2121 R_run.DeleteValue("应用名称", false); 2222 R_run.Close(); 2323 R_local.Close(); 2424 } 2525 2626 //GlobalVariant.Instance.UserConfig.AutoStart = isAuto; 2727 } 2828 catch (Exception) 2929 { 3030 //MessageBoxDlg dlg = new MessageBoxDlg(); 3131 //dlg.InitialData("您需要管理员权限修改", "提示", MessageBoxButtons.OK, MessageBoxDlgIcon.Error); 3232 //dlg.ShowDialog(); 3333 MessageBox.Show("您需要管理员权限修改", "提示"); 3434 }

注:该程序的启动项设置到HKEY_Current_User 下,推荐。如果想改在HKEY_LOCAL_MACHINE,只需将CurrentUser改为LocalMachine,即

1 Rkey = Microsoft.Win32.Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");

操作注册表有可能会需要程序有管理员权限,这时候就要在程序以管理员身份启动并运行。此时应进行以下操作。

1、在程序中添加程序清单文件。通过VS添加,右键项目选择添加选择新建项,选择程序清单。如下图。

2、设置UAC 选项。如图。

转载地址: https://blog.csdn.net/wangzl1163/article/details/75040615

                 http://blog.csdn.net/liyc123youxiang/article/details/45870563

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )