// Logic to cancel scheduled action
 public void Cancel_Actions(object sender, RoutedEventArgs e)
 {
     HibernateTokenSource.Cancel();
     SleepTokenSource.Cancel();
     System.Diagnostics.Process          process   = new System.Diagnostics.Process();
     System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
     startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
     startInfo.FileName    = "cmd.exe";
     process.StartInfo     = startInfo;
     startInfo.Arguments   = "/C shutdown -a";
     process.Start();
     Log_Block.AppendText("Scheduled actions canceled." + Environment.NewLine);
     Log_Block.ScrollToEnd();
     System.Windows.MessageBox.Show("Scheduled actions have been canceled.", "Success");
 }
        public MainWindow()
        {
            InitializeComponent();
            timePicker.Value         = DateTime.Now;
            Shutdown_Radio.IsChecked = true;


            if (HibernateEnabled() == false)
            {
                Hibernate_Radio.IsEnabled = false;
                Hibernate_Radio.ToolTip   = "Hibernate is not supported by your computer";
                Log_Block.Text           += "Hibernate is not supported by your computer." + Environment.NewLine;
                Log_Block.ScrollToEnd();
            }
            else
            {
                Log_Block.Text += "Hibernate is supported by your computer." + Environment.NewLine;
                Log_Block.ScrollToEnd();
            }
        }
        public void Shutdown_Click(object sender, RoutedEventArgs e)
        {
            CancellationTokenSource source = new CancellationTokenSource();

            // Prepare default value
            DateTime LocalTime         = DateTime.Now;
            TimeSpan OneHour           = new TimeSpan(0, 1, 0, 0);
            DateTime OneHourIntoFuture = (LocalTime + OneHour);
            Boolean  IsForceChecked    = Force_Checkbox.IsChecked ?? false;
            DateTime UserSelectedTime  = timePicker.Value ?? OneHourIntoFuture;

            // Check for valid scheduled time and pass arguments to Windows command
            if (UserSelectedTime > DateTime.Now.AddDays(23))
            {
                Log_Block.AppendText("Selected time must be within 23 days." + Environment.NewLine);
                Log_Block.ScrollToEnd();
                System.Windows.MessageBox.Show("Please enter a time within 23 days.", "Error");
            }
            else if (UserSelectedTime >= DateTime.Now)
            {
                // Calculate time difference between local time and selected scheduled time
                TimeSpan TimeDifference = (UserSelectedTime - LocalTime);

                //Convert TimeDifference into seconds, rounding down
                int TimeDiffSeconds = (int)(Math.Floor(TimeDifference.TotalSeconds));
                int TimeDiffMillis  = (int)(Math.Floor(TimeDifference.TotalMilliseconds));



                switch (Action_Title)
                {
                case "Hibernate":
                    // Creates task for (forced) hibernate
                    var HibernateTask = Task.Run(async delegate
                    {
                        await Task.Delay(TimeDiffMillis, HibernateTokenSource.Token);
                        SetSuspendState(b1, b2, b3);
                    });
                    Log_Block.AppendText(Action_Title + " (forced)" + " scheduled for " + UserSelectedTime + Environment.NewLine);
                    Log_Block.ScrollToEnd();
                    System.Windows.MessageBox.Show(Action_Title + " (forced)" + " scheduled for " + UserSelectedTime, "Success");

                    break;

                case "Sleep":
                    if (IsForceChecked)
                    {
                        b2 = true;
                        // Creates task for (forced) sleep
                        var ForcedSleepTask = new Task(async delegate
                        {
                            await Task.Delay(TimeDiffMillis, ForcedSleepTokenSource.Token);
                            SetSuspendState(b1, b2, b3);
                        });
                        Log_Block.AppendText(Action_Title + " (forced)" + " scheduled for " + UserSelectedTime + Environment.NewLine);
                        Log_Block.ScrollToEnd();
                        System.Windows.MessageBox.Show(Action_Title + " (forced)" + " scheduled for " + UserSelectedTime, "Success");
                    }
                    else
                    {
                        b2 = false;
                        // Creates task for sleep
                        var SleepTask = new Task(async delegate
                        {
                            await Task.Delay(TimeDiffMillis, SleepTokenSource.Token);
                            SetSuspendState(b1, b2, b3);
                        });
                        Log_Block.AppendText(Action_Title + " scheduled for " + UserSelectedTime + Environment.NewLine);
                        Log_Block.ScrollToEnd();
                        System.Windows.MessageBox.Show(Action_Title + " scheduled for " + UserSelectedTime, "Success");
                    }
                    break;

                case "Shutdown":
                case "Restart":
                    // Connect to command prompt
                    System.Diagnostics.Process          process   = new System.Diagnostics.Process();
                    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                    startInfo.FileName    = "cmd.exe";
                    process.StartInfo     = startInfo;

                    if (IsForceChecked)
                    {
                        startInfo.Arguments = "/C shutdown -f " + Action_Argument + " -t " + TimeDiffSeconds;
                        process.Start();
                        Log_Block.AppendText(Action_Title + " (forced)" + " scheduled for " + UserSelectedTime + Environment.NewLine);
                        Log_Block.ScrollToEnd();
                        System.Windows.MessageBox.Show(Action_Title + " (forced)" + " scheduled for " + UserSelectedTime, "Success");
                    }
                    else
                    {
                        startInfo.Arguments = "/C shutdown " + Action_Argument + " -t " + TimeDiffSeconds;
                        process.Start();
                        Log_Block.AppendText(Action_Title + " scheduled for " + UserSelectedTime + Environment.NewLine);
                        Log_Block.ScrollToEnd();
                        System.Windows.MessageBox.Show(Action_Title + " scheduled for " + UserSelectedTime, "Success");
                    }
                    break;
                }
            }
            else
            {
                Log_Block.AppendText("Invalid time entered." + Environment.NewLine);
                Log_Block.ScrollToEnd();
                System.Windows.MessageBox.Show("Please enter a valid time.", "Error");
            }
        }