有两种方法:
一是把程序的快捷方式放到windows的自启动目录下,如下所示
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
二是把自启动信息写入到注册表,不过需要有管理员权限,感觉有点麻烦。
这里演示的是第一种方法。使用第一种方法时,需要引用COM中的
Windows Script Host Object Model
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
using IWshRuntimeLibrary;
namespace AutoStartHelper
{
internal class AutoStart
{
/// <summary>
/// 快捷方式的显示名称
/// </summary>
private string _ShortCutName;
/// <summary>
/// 程序的完整路径
/// </summary>
private string _AppPath;
/// <summary>
/// 操作系统的自启动目录
/// C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
/// C:\Users\[用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
/// </summary>
private string _SysAutoStartPath;
/// <summary>
/// 操作系统桌面的路径
/// </summary>
private string _SysDesktopPath;
public string ShortCutName { set => _ShortCutName = value; get => _ShortCutName; }
public string AppPath { get => _AppPath; }
public string SysAutoStartPath { get => _SysAutoStartPath; }
public string SysDesktopPath { get => _SysDesktopPath; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="shortCutName">快捷方式的显示名称</param>
public AutoStart(string shortCutName = null)
{
_ShortCutName = shortCutName;
_AppPath = Process.GetCurrentProcess().MainModule.FileName;
_SysAutoStartPath = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
_SysDesktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
}
/// <summary>
/// 获取指定文件夹下的所有快捷方式(不包括子文件夹)
/// </summary>
/// <param target="">目标文件夹(绝对路径)</param>
/// <returns></returns>
public List<string> GetDirectoryFileList(string target)
{
List<string> list = new List<string>();
list.Clear();
string[] files = Directory.GetFiles(target, "*.lnk");
if (files == null || files.Length == 0)
{
return list;
}
for (int i = 0; i < files.Length; i++)
{
list.Add(files[i]);
}
return list;
}
/// <summary>
/// 获取快捷方式中的目标(可执行文件的绝对路径)
/// </summary>
/// <param name="shortCutPath">快捷方式的绝对路径</param>
/// <returns></returns>
public string GetAppPathViaShortCut(string shortCutPath)
{
try
{
WshShell shell = new WshShell();
IWshShortcut shortct = (IWshShortcut)shell.CreateShortcut(shortCutPath);
//快捷方式文件指向的路径.Text = 当前快捷方式文件IWshShortcut类.TargetPath;
//快捷方式文件指向的目标目录.Text = 当前快捷方式文件IWshShortcut类.WorkingDirectory;
return shortct.TargetPath;
}
catch
{
return null;
}
}
/// <summary>
/// 判断快捷方式是否存在
/// </summary>
/// <param name="path">快捷方式目标(可执行文件的绝对路径)</param>
/// <param name="target">快捷方式所在目录(绝对路径)</param>
/// <returns></returns>
public bool ShortCutExist(string path, string target)
{
bool Result = false;
List<string> list = GetDirectoryFileList(target);
foreach (var item in list)
{
if (path == GetAppPathViaShortCut(item))
{
Result = true;
}
}
return Result;
}
/// <summary>
/// 删除快捷方式(通过快捷方式目标进行删除)
/// </summary>
/// <param name="path">快捷方式目标(可执行文件的绝对路径)</param>
/// <param name="target">快捷方式所在目录(绝对路径)</param>
/// <returns></returns>
public bool ShortCutDelete(string path, string target)
{
bool Result = false;
List<string> list = GetDirectoryFileList(target);
foreach (var item in list)
{
if (path == GetAppPathViaShortCut(item))
{
System.IO.File.Delete(item);
Result = true;
}
}
return Result;
}
/// <summary>
/// 创建快捷方式
/// </summary
/// <param name="name">快捷方式名称</param>
/// <param name="path">快捷方式目标(可执行文件的绝对路径)</param>
/// <param name="target">快捷方式所在目录(绝对路径)</param>
/// <returns></returns>
public bool ShortCutCreate(string name, string path, string target)
{
bool Result = false;
try
{
// 判断快捷方式是否存在
if (ShortCutExist(path, target)) {
return false;
}
// 如果文件夹不存在则创建
if (!Directory.Exists(target)) Directory.CreateDirectory(target);
// 快捷方式的路径
string ShortCutPath = Path.Combine(target, string.Format("{0}.lnk", name));
// 创建快捷方式对象
WshShell Shell = new WshShell();
IWshShortcut ShortCut = (IWshShortcut)Shell.CreateShortcut(ShortCutPath);
// 设置快捷方式目标路径
ShortCut.TargetPath = path;
// 设置快捷方式目标文件夹
ShortCut.WorkingDirectory = Path.GetDirectoryName(path);
// 设置运行方式,默认为常规窗口
ShortCut.WindowStyle = 1;
// 保存快捷方式
ShortCut.Save();
Result = true;
}
catch
{
Result = false;
}
return Result;
}
}
}