今天测试给反馈说:"你的程序加入开机自启动,他就是死活不启动 ";既然有问题咱们就一点点定位问题白;先来看看系统日志 :
没明白哪里的问题
;回想起咱的程序是必须管理员权限运行;然而系统又是普通用户;想到使用系统自带的任务计划,发现结果好使:
1、那就直接代码实现吧,参考开源:
https://github.com/dahall/taskscheduler
2、创建任务计划的方法:
private void Run()
{
string path = ViewModel.ExePath;
string taskName = "DataCollect";
using(TaskService ts = new TaskService())
{
// 检查任务是否已存在
var task = ts.GetTask(taskName);
if(task == null)
{
// 创建一个新的任务定义
TaskDefinition td = ts.NewTask();
td.RegistrationInfo.Description = "启动设备采集服务";
// 创建一个触发器,设置为在系统启动后触发
BootTrigger bt = new BootTrigger
{
// 设置延迟30秒启动
Delay = TimeSpan.FromSeconds(30)
};
td.Triggers.Add(bt);
// 这里是启动咱们的软件
td.Actions.Add(new ExecAction(path, null, null));
// 设置任务使用最高权限运行
td.Principal.RunLevel = TaskRunLevel.Highest;
try
{
// 注册任务到根文件夹
ts.RootFolder.RegisterTaskDefinition(taskName, td);
ViewModel.OperType = OperationTypeEnum.Success;
timer.Stop();
timer.Start();
}
catch(Exception ex)
{
ViewModel.OperType = OperationTypeEnum.Fail;
}
}
else
{
Console.WriteLine("Task already exists.");
}
}
}
3、读取注册表的方式获取软件的安装目录:
staticstringGetInstallPath(string softwareName)
{
string baseKeyPath = @"SOFTWARE\WOW6432Node\company";
// 尝试打开 'company' 键
using(RegistryKey baseKey = Registry.LocalMachine.OpenSubKey(baseKeyPath))
{
if(baseKey != null)
{
// 检查是否存在 "设备采集程序" 子键
using(RegistryKey subKey = baseKey.OpenSubKey(softwareName))
{
if(subKey != null)
{
//安装路径存储在名为 "Path" 的键中
string pathValue = subKey.GetValue("Path") asstring;
return pathValue;
}
}
}
}
returnnull;
}
4、安装目录有了,那就直接创建任务计划:
5、看看成功后的任务计划结果:
编程不息、Bug不止、无Bug、无生活 ; 改 bug 的冷静、编码的激情、完成后的喜悦、挖坑的激动 、填坑的兴奋;这也许就是屌丝程序员的乐趣吧; 今天就到这里吧;希望自己有动力一步一步坚持下去;生命不息,代码不止;大家抽空可以看看今天分享的效果,有好的意见和想法,可以在留言板随意留言;我看到后会第一时间回复大家,多谢大家的一直默默的关注和支持! 如果觉得不错,那就伸出您的小手点个赞并关注一下,多谢您的支持!