Click here to Skip to main content
15,867,686 members
Articles / Programming Languages / C#
Article

Timer Computer Shutdown

Rate me:
Please Sign up or sign in to vote.
4.63/5 (16 votes)
2 Oct 2002 348.4K   13.4K   106   40
This application provides functionality to Shutdown, Restart, Stand By, Hibernate or Log Off supported computers at a selected date and time.

Sample Image - TimerComputerShutdown.jpg

Introduction

Timer Computer Shutdown application provides functionality to shutdown, restart, stand by, hibernate or log off supported computers, at a selected date and time that has yet to elapse. Functionality of the shutdown modes has been provided by a WindowsController.cs class from http://www.mentalis.org/soft/class.qpx?id=7

WARNING: The "Brute" option will force termination of all running processes, any unsaved data will be lost; guaranteeing a shutdown. This option has been designed to close applications which produce a prompt upon closing.

The code

C#
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;

using Org.Mentalis.Utilities;

namespace TimerComputerShutdown
{
    /// <summary>
    /// Summary description for TimerComputerShutdown.
    /// </summary>
    public class TimerComputerShutdown : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Label 
              labelWhatDoYouWantTheComputerToDo;
        private System.Windows.Forms.ComboBox comboBox;
        private System.Windows.Forms.Label 
              labelSelectDateTimeToShutdownComputer;
        private System.Windows.Forms.DateTimePicker 
              dateTimePicker;
        private System.Windows.Forms.Label labelDateTimeNow;
        private System.Windows.Forms.Label 
              labelDateTimeShutdown;
        private System.Windows.Forms.Label labelNow;
        private System.Windows.Forms.Label labelShutdown;
        private System.Windows.Forms.Panel panelParent;
        private System.Windows.Forms.Panel panelChild;
        private System.Windows.Forms.CheckBox checkBox;
        private System.Windows.Forms.Button buttonAbout; 
        private System.Windows.Forms.Button buttonCancel;
        private System.Windows.Forms.Button buttonInvoke;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container 
                               components = null;
        
        private System.Threading.ThreadStart threadStart;
        private System.Threading.Thread thread;

        [DllImport("user32.dll")] private static extern 
            bool SetForegroundWindow(IntPtr hWnd);
        [DllImport("user32.dll")] private static extern 
            bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
        [DllImport("user32.dll")] private static extern 
            bool IsIconic(IntPtr hWnd);

        private const int SW_HIDE = 0;
        private const int SW_SHOWNORMAL = 1;
        private const int SW_SHOWMINIMIZED = 2;
        private const int SW_SHOWMAXIMIZED = 3;
        private const int SW_SHOWNOACTIVATE = 4;
        private const int SW_RESTORE = 9;
        private const int SW_SHOWDEFAULT = 10;
        
        public TimerComputerShutdown()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code 
            // after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
                    ...
        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new TimerComputerShutdown());
        }

        private void TimerComputerShutdown_Load
                 (object sender, System.EventArgs e)
        {
            this.threadStart = new System.Threading.
                             ThreadStart(Application_Tick);
            this.thread = new System.Threading.Thread(threadStart);
            
            this.panelChild.Visible = false;

            this.dateTimePicker.Value = System.DateTime.Now;
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            try
            {
                if (this.thread.IsAlive)
                {
                    this.thread.Abort();
                    this.thread.Join();
                }
            }
            catch (System.Threading.ThreadAbortException 
                                     threadAbortException)
            {
                System.Threading.Thread.ResetAbort();
            }
            catch (System.Exception exception)
            {
                
            }
            finally
            {
                System.Windows.Forms.Application.Exit();
            }

            base.OnClosing(e);
        }

        public void Computer_Shutdown()
        {
            if (this.checkBox.Checked)
            {
                System.Diagnostics.Process[] processes = 
                   System.Diagnostics.Process.GetProcesses();

                foreach (System.Diagnostics.Process 
                           processParent in processes)
                {
                    System.Diagnostics.Process[] processNames = 
                                 System.Diagnostics.Process.
                                 GetProcessesByName
                                 (processParent.ProcessName);
    
                    foreach (System.Diagnostics.Process 
                            processChild in processNames)
                    {
                        try
                        {
                            System.IntPtr hWnd = 
                                   processChild.MainWindowHandle;
                            
                            if (IsIconic(hWnd))
                            {
                                ShowWindowAsync(hWnd, SW_RESTORE);
                            }
                    
                            SetForegroundWindow(hWnd);
                            
                            if (!(processChild.
                               MainWindowTitle.Equals(this.Text)))
                            {
                                processChild.CloseMainWindow();
                                processChild.Kill();
                                processChild.WaitForExit();
                            }
                        }
                        catch (System.Exception exception)
                        {

                        }
                    }
                }
            }

            System.Windows.Forms.Application.Exit();

            switch (this.comboBox.SelectedIndex)
            {
                case 0:
                    Org.Mentalis.Utilities.
                            WindowsController.ExitWindows
                            (RestartOptions.PowerOff, false);
                    break;
                case 1:
                    Org.Mentalis.Utilities.WindowsController.
                         ExitWindows(RestartOptions.Reboot, false);
                    break;
                case 2:
                    Org.Mentalis.Utilities.WindowsController.
                         ExitWindows(RestartOptions.Suspend, false);
                    break;
                case 3:
                    Org.Mentalis.Utilities.WindowsController.
                         ExitWindows(RestartOptions.Hibernate, false);
                    break;
                case 4:
                    Org.Mentalis.Utilities.WindowsController.
                         ExitWindows(RestartOptions.LogOff, false);
                    break;
            }
        }
        
        private void comboBox_SelectedIndexChanged
                 (object sender, System.EventArgs e)
        {
            this.labelSelectDateTimeToShutdownComputer.Text =
                 "Select Date/Time to" + " " + 
                 this.comboBox.SelectedItem.ToString() + 
                 " " + "computer:";
            this.labelDateTimeShutdown.Text = "Date/Time" + 
                 " " + this.comboBox.SelectedItem.ToString() + ":";
        }

        private void checkBox_CheckedChanged(object sender, 
                                        System.EventArgs e)
        {
            if (this.checkBox.Checked)
            {
                Warning warning = new Warning();
                warning.ShowDialog();
            }
        }

        public bool dateTimePicker_Validated()
        {
            if (this.dateTimePicker.Value.
                   CompareTo(System.DateTime.Now) < 0)
            {
                Error error = new Error();
                error.ShowDialog();

                this.dateTimePicker.Value = System.DateTime.Now;

                return false;
            }
            else
            {
                return true;
            }
        }

        private void dateTimePicker_ValueChanged
                 (object sender, System.EventArgs e)
        {
            this.labelShutdown.Text = 
                   this.dateTimePicker.Value.ToString();
        }

        public void Application_Tick()
        {
            while (!(this.labelNow.Text.ToString().
                   Equals(this.dateTimePicker.Value.ToString())))
            {
                this.labelNow.Text = System.DateTime.Now.ToString();
            }

            this.Computer_Shutdown();
        }

        private void buttonAbout_Click(object sender, 
                                    System.EventArgs e)
        {
            About about = new About();

            about.ShowDialog();
        }

        private void buttonCancel_Click(object sender, 
                                      System.EventArgs e)
        {
            try
            {
                if (this.thread.IsAlive)
                {
                    this.thread.Abort();
                    this.thread.Join();
                }
            }
            catch (System.Threading.
                   ThreadStateException threadStateException)
            {
                System.Threading.Thread.ResetAbort();
            }
            catch (System.Exception exception)
            {
                
            }
            finally
            {
                System.Windows.Forms.Application.Exit();
            }
        }
        
        private void buttonInvoke_Click(object sender, 
                                    System.EventArgs e)
        {
            if (this.dateTimePicker_Validated())
            {
                this.thread.Start();

                this.comboBox.Enabled = false;
                this.dateTimePicker.Enabled = false;
                this.panelChild.Visible = true;
                this.buttonInvoke.Enabled = false;
            }
        }
    }
}

That's all!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralRe: Logoff after program finishes Pin
Steve Puri21-Apr-04 22:24
Steve Puri21-Apr-04 22:24 
GeneralSave ressources Pin
mim2000@gmx.ch27-Nov-03 22:50
mim2000@gmx.ch27-Nov-03 22:50 
GeneralRe: Save ressources Pin
Steve Puri28-Nov-03 1:13
Steve Puri28-Nov-03 1:13 
GeneralRe: Save ressources Pin
Member 88961013-May-04 5:17
Member 88961013-May-04 5:17 
GeneralRe: Save ressources Pin
Steve Puri13-May-04 9:00
Steve Puri13-May-04 9:00 
GeneralRe: Save ressources Pin
Member 88961014-May-04 5:12
Member 88961014-May-04 5:12 
GeneralDying to shutdown Pin
louis7-Oct-02 21:19
louis7-Oct-02 21:19 
GeneralRe: Dying to shutdown Pin
Anonymous8-Oct-02 11:48
Anonymous8-Oct-02 11:48 
You need the .NET Framework installed http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/000/976/msdncompositedoc.xml or the .NET Redistributable http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/MSDN-FILES/027/001/829/msdncompositedoc.xml&frame=true.
"Unfortunately I am not a Visual Basic programmer" - You mean fortunately! Wink | ;) But whats that got to do with anything anyway?
GeneralRe: Dying to shutdown Pin
Donny liu8-May-05 19:37
Donny liu8-May-05 19:37 
Generallol Pin
Steve McLenithan4-Oct-02 17:45
Steve McLenithan4-Oct-02 17:45 
General... Pin
Steve McLenithan4-Oct-02 12:20
Steve McLenithan4-Oct-02 12:20 
GeneralRe: ... Pin
Steve Puri4-Oct-02 15:15
Steve Puri4-Oct-02 15:15 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.