[TOC] # 原理簡介 本文參考[C#/WPF/WinForm/程式實現軟體開機自動啟動的兩種常用方法](https://blog.csdn.net/weixin_42288432/article/details/120059296),將裡面中的第一種方法做了封裝成**AutoStart**類,使 ...
目錄
原理簡介
本文參考C#/WPF/WinForm/程式實現軟體開機自動啟動的兩種常用方法,將裡面中的第一種方法做了封裝成AutoStart類,使用時直接兩三行代碼就可以搞定。
自啟動的原理是將軟體的快捷方式創建到電腦的自動啟動目錄下(不需要管理員許可權),這種方法更加通用、限制更少。
使用方法
使用方法如下:
//快捷方式的描述、名稱的預設值是當前的進程名,自啟動預設為正常視窗,一般情況下不需要手動設置
//設置快捷方式的描述,
AutoStart.Instance.QuickDescribe = "軟體描述";
//設置快捷方式的名稱
AutoStart.Instance.QuickName = "軟體名稱";
//設置自啟動的視窗類型,後臺服務類的軟體可以設置為最小視窗
AutoStart.Instance.WindowStyle = WshWindowStyle.WshMinimizedFocus;
//快捷方式設置true時,有就忽略、沒有就創建,自啟動快捷方式只能存在一個
//設置開機自啟動,true 自啟動,false 不自啟動
AutoStart.Instance.SetAutoStart(SysParam.Instance.OnOff);
//設置桌面快捷方式,true 創建桌面快捷方式(有就跳過,沒有就創建),false 刪除桌面快捷方式
AutoStart.Instance.SetDesktopQuick(true);
完整代碼
引用以下命名空間:
//添加引用,在 Com 中搜索 Windows Script Host Object Model
using IWshRuntimeLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
AutoStart類代碼:
public class AutoStart
{
#region 公開
/// <summary>
/// 唯一實例,也可以自定義實例
/// </summary>
public static AutoStart Instance { get; private set; } = new AutoStart();
/// <summary>
/// 快捷方式描述,預設值是當前的進程名
/// </summary>
public string QuickDescribe { get; set; } = Process.GetCurrentProcess().ProcessName;
/// <summary>
/// 快捷方式名稱,預設值是當前的進程名
/// </summary>
public string QuickName { get; set; } = Process.GetCurrentProcess().ProcessName;
/// <summary>
/// 自啟動視窗類型,預設值是正常視窗
/// </summary>
public WshWindowStyle WindowStyle { get; set; } = WshWindowStyle.WshNormalFocus;
/// <summary>
/// 設置開機自動啟動-只需要調用改方法就可以了參數裡面的bool變數是控制開機啟動的開關的,預設為開啟自啟啟動
/// </summary>
/// <param name="onOff">自啟開關</param>
public void SetAutoStart(bool onOff = true)
{
if (onOff)//開機啟動
{
//獲取啟動路徑應用程式快捷方式的路徑集合
List<string> shortcutPaths = GetQuickFromFolder(systemStartPath, appAllPath);
//存在2個以快捷方式則保留一個快捷方式-避免重覆多於
if (shortcutPaths.Count >= 2)
{
for (int i = 1; i < shortcutPaths.Count; i++)
{
DeleteFile(shortcutPaths[i]);
}
}
else if (shortcutPaths.Count < 1)//不存在則創建快捷方式
{
CreateShortcut(systemStartPath, QuickName, appAllPath, QuickDescribe,WindowStyle);
}
}
else//開機不啟動
{
//獲取啟動路徑應用程式快捷方式的路徑集合
List<string> shortcutPaths = GetQuickFromFolder(systemStartPath, appAllPath);
//存在快捷方式則遍歷全部刪除
if (shortcutPaths.Count > 0)
{
for (int i = 0; i < shortcutPaths.Count; i++)
{
DeleteFile(shortcutPaths[i]);
}
}
}
//創建桌面快捷方式-如果需要可以取消註釋
//CreateDesktopQuick(desktopPath, QuickName, appAllPath);
}
/// <summary>
/// 在桌面上創建快捷方式-如果需要可以調用
/// </summary>
public void SetDesktopQuick(bool isCreate)
{
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
List<string> shortcutPaths = GetQuickFromFolder(desktopPath, appAllPath);
if (isCreate)
{
//沒有就創建
if (shortcutPaths.Count < 1)
{
CreateShortcut(desktopPath, QuickName, appAllPath, QuickDescribe, WshWindowStyle.WshNormalFocus);
}
}
else
{
//有就刪除
for (int i = 0; i < shortcutPaths.Count; i++)
{
DeleteFile(shortcutPaths[i]);
}
}
}
#endregion 公開
#region 私有
/// <summary>
/// 自動獲取系統自動啟動目錄
/// </summary>
private string systemStartPath = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
/// <summary>
/// 自動獲取程式完整路徑
/// </summary>
private string appAllPath = Process.GetCurrentProcess().MainModule.FileName;
/// <summary>
/// 自動獲取桌面目錄
/// </summary>
private string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
/// <summary>
/// 向目標路徑創建指定文件的快捷方式
/// </summary>
/// <param name="directory">目標目錄</param>
/// <param name="shortcutName">快捷方式名字</param>
/// <param name="targetPath">文件完全路徑</param>
/// <param name="description">描述</param>
/// <param name="iconLocation">圖標地址</param>
/// <returns>成功或失敗</returns>
private bool CreateShortcut(string directory, string shortcutName, string targetPath, string description, WshWindowStyle windowStyle, string iconLocation = null)
{
try
{
//目錄不存在則創建
if (!Directory.Exists(directory)) Directory.CreateDirectory(directory);
//合成路徑
string shortcutPath = Path.Combine(directory, string.Format("{0}.lnk", shortcutName));
//存在則不創建
if (System.IO.File.Exists(shortcutPath)) return true;
//添加引用 Com 中搜索 Windows Script Host Object Model
WshShell shell = new IWshRuntimeLibrary.WshShell();
//創建快捷方式對象
IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(shortcutPath);
//指定目標路徑
shortcut.TargetPath = targetPath;
//設置起始位置
shortcut.WorkingDirectory = Path.GetDirectoryName(targetPath);
//設置運行方式,預設為常規視窗
shortcut.WindowStyle = (int)windowStyle;
//設置備註
shortcut.Description = description;
//設置圖標路徑
shortcut.IconLocation = string.IsNullOrWhiteSpace(iconLocation) ? targetPath : iconLocation;
//保存快捷方式
shortcut.Save();
return true;
}
catch (Exception ex)
{
string temp = ex.Message;
temp = "";
}
return false;
}
/// <summary>
/// 獲取指定文件夾下指定應用程式的快捷方式路徑集合
/// </summary>
/// <param name="directory">文件夾</param>
/// <param name="targetPath">目標應用程式路徑</param>
/// <returns>目標應用程式的快捷方式</returns>
private List<string> GetQuickFromFolder(string directory, string targetPath)
{
List<string> tempStrs = new List<string>();
tempStrs.Clear();
string tempStr = null;
string[] files = Directory.GetFiles(directory, "*.lnk");
if (files == null || files.Length < 1)
{
return tempStrs;
}
for (int i = 0; i < files.Length; i++)
{
//files[i] = string.Format("{0}\\{1}", directory, files[i]);
tempStr = GetAppPathFromQuick(files[i]);
if (tempStr == targetPath)
{
tempStrs.Add(files[i]);
}
}
return tempStrs;
}
/// <summary>
/// 獲取快捷方式的目標文件路徑-用於判斷是否已經開啟了自動啟動
/// </summary>
/// <param name="shortcutPath"></param>
/// <returns></returns>
private string GetAppPathFromQuick(string shortcutPath)
{
//快捷方式文件的路徑 = @"d:\Test.lnk";
if (System.IO.File.Exists(shortcutPath))
{
WshShell shell = new WshShell();
IWshShortcut shortct = (IWshShortcut)shell.CreateShortcut(shortcutPath);
//快捷方式文件指向的路徑.Text = 當前快捷方式文件IWshShortcut類.TargetPath;
//快捷方式文件指向的目標目錄.Text = 當前快捷方式文件IWshShortcut類.WorkingDirectory;
return shortct.TargetPath;
}
else
{
return "";
}
}
/// <summary>
/// 根據路徑刪除文件-用於取消自啟時從電腦自啟目錄刪除程式的快捷方式
/// </summary>
/// <param name="path">路徑</param>
private void DeleteFile(string path)
{
FileAttributes attr = System.IO.File.GetAttributes(path);
if (attr == FileAttributes.Directory)
{
Directory.Delete(path, true);
}
else
{
System.IO.File.Delete(path);
}
}
#endregion 私有
}