728x90

이번에 개발한 프로그램이 윈도우 시작시 실행이 되어야 하는데, 레지스트리에 등록을 해서 실행을 하니 관리자 권한이 필요한 프로그램이라 실행이되지 않았다.

 

그래서 작업 스케줄러에 등록하는 방법으로 하였다.

 

trigger를 BootTrigger로 줘야만 부팅 후 LockWorkStation 상태에서 프로그램이 켜질 줄 알았는데, LogonTrigger로 줘도 무방했다. BootTrigger를 주면 오히려 프로그램이 제대로 동작하지 않는 현상이 발생했다.

class WindowsAutoStarter
{
    private const string kTASK_SCHEDULER_NAME = "My App";
    public static void SetAutoStart(bool enable)
    {
        TaskService taskService = new TaskService();
        TaskDefinition taskDefinition = taskService.NewTask();

        if (enable)
        {
            // trrigger
            taskDefinition.Triggers.Add(new LogonTrigger());
            //taskDefinition.Triggers.Add(new BootTrigger());

            // general
            taskDefinition.Principal.DisplayName = "ProgramName";
            taskDefinition.RegistrationInfo.Description = "blahblah";
            taskDefinition.Principal.UserId = string.Concat(Environment.UserDomainName, "\\", Environment.UserName);
            taskDefinition.Principal.LogonType = TaskLogonType.InteractiveToken;
            taskDefinition.Principal.RunLevel = TaskRunLevel.Highest;

            // condition 
            taskDefinition.Settings.MultipleInstances = TaskInstancesPolicy.IgnoreNew;
            taskDefinition.Settings.DisallowStartIfOnBatteries = false;
            taskDefinition.Settings.StopIfGoingOnBatteries = false;
            taskDefinition.Settings.AllowHardTerminate = false;
            taskDefinition.Settings.StartWhenAvailable = false;
            taskDefinition.Settings.RunOnlyIfNetworkAvailable = false;
            taskDefinition.Settings.IdleSettings.StopOnIdleEnd = false;
            taskDefinition.Settings.IdleSettings.RestartOnIdle = false;

			// setting
            taskDefinition.Settings.AllowDemandStart = false;
            taskDefinition.Settings.Enabled = true;
            taskDefinition.Settings.Hidden = false;
            taskDefinition.Settings.RunOnlyIfIdle = false;
            taskDefinition.Settings.ExecutionTimeLimit = TimeSpan.Zero;
            taskDefinition.Settings.Priority = System.Diagnostics.ProcessPriorityClass.High;

            // operate
            taskDefinition.Actions.Add(new ExecAction(Application.ExecutablePath));

			// registration
            taskService.RootFolder.RegisterTaskDefinition(kTASK_SCHEDULER_NAME, taskDefinition);
        }
        else
        {
        	Microsoft.Win32.TaskScheduler.Task t = taskService.GetTask(kTASK_SCHEDULER_NAME);
            if (t != null)
            	taskService.RootFolder.DeleteTask(kTASK_SCHEDULER_NAME, true);
        }
    }
}

 

 

출처 : https://neofirst.tistory.com/346

728x90

'Basic Programming > C#' 카테고리의 다른 글

C# - Steam Game 실행하기  (0) 2020.07.21
C# - Dispose  (0) 2018.10.12
C# - WeakReference  (0) 2018.10.11
C# - 공부하기 좋은 사이트  (0) 2018.09.05
C# - Attibute  (0) 2018.07.09

+ Recent posts