C# 定时关机小应用

C# 定时关机小应用(Winform)

一、简述

     记--使用winform实现的定时关机小应用。通过执行cmd命令实现的。(Visual Studio 2010旗舰版)

     例子打包:链接: https://pan.baidu.com/s/17cVw_nzo2QPqmHwIHK57Ww 提取码: shzm 

二、效果

            

            

三、工程结构及布局视图

 

四、源文件

Form1.cs文件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace SetTime1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            lblNow.BackColor = Color.Gainsboro;
        }
        /// <summary>
        /// 窗体加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {

            try
            {
                //显示当前时间
                lblNow.Text = DateTime.Now.ToString("yyyy年MM月dd日hh时mm分ss秒");
                Timer timer = new Timer();
                timer.Tick += new EventHandler(this.timer_Tick);
                timer.Enabled = true;

                //不断捕获鼠标位置
                Timer timer1 = new Timer();
                timer1.Tick += new EventHandler(this.timer1_Tick);
                timer1.Enabled = true;

                //初始化模式一
                InitialModel1();

                //初始化重启模式
                InitialRset();

                //初始化模式2
                InitialModel2();
            }
            catch { }

        }
        /// <summary>
        /// 当前时间
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer_Tick(object sender, EventArgs e)//当前时间
        {
            try
            {
                //在标签上实时显示当前时间
                lblNow.Text = DateTime.Now.ToString("yyyy年MM月dd日HH时mm分ss秒");
            }
            catch{}
        }
        /// <summary>
        /// 窗体贴边
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)//窗体贴边
        {
            try
            {
                int ScreenWidth = Screen.PrimaryScreen.WorkingArea.Width;  //获取屏幕宽度 
                int ScreenRight = Screen.PrimaryScreen.WorkingArea.Right; //获取屏幕高度 
                System.Drawing.Point mouse_pos = new Point(Cursor.Position.X, Cursor.Position.Y);//获取鼠标在屏幕的坐标点
                Rectangle Rects = new Rectangle(this.Left, this.Top, this.Left + this.Width, this.Top + this.Height);//存储当前窗体在屏幕的所在区域
                
                if ((this.Top < 0) && Win32API.PtInRect(ref Rects, mouse_pos))//当鼠标在当前窗体内,并且窗体的Top属性小于0
                {//如果窗体已经上贴边了并且鼠标在窗体内部,上贴边展开
                    this.Top = 0;//设置窗体的Top属性为0
                }
                else if (this.Top > -5 && this.Top < 5 && !(Win32API.PtInRect(ref Rects, mouse_pos)))
                {//当窗体的上边框与屏幕的顶端的距离小于5,并且鼠标不在窗体内部时
                         this.Top = 5 - this.Height;//将窗体隐藏到屏幕的顶端,即上贴边
                }
                
                if ((this.Left >= ScreenWidth - 5) && Win32API.PtInRect(ref Rects, mouse_pos))//当鼠标在当前窗体内,并且窗体的Left属性小于ScreenWidth
                {//如果窗体已经右贴边了并且鼠标在窗体内部,右贴边展开
                    this.Left = ScreenWidth - this.Width;//设置窗体的Left属性为ScreenWidth
                }
                else if (this.Right >= ScreenWidth && !(Win32API.PtInRect(ref Rects, mouse_pos)))
                {//当窗体的右边框与屏幕的右端的距离小于+5时,并且鼠标不在窗体内部,右贴边
                    this.Left = ScreenWidth - 5;//将窗体隐藏到屏幕的右端
                }
            }
            catch { }
        }
        #region 无边框窗体拖动
        //-------------------无边框窗体拖动---------------------------  
        Point mouseOff;//鼠标移动位置变量  
        bool leftFlag;//标志左键是否按下
 
        //鼠标按下
        private void Form_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                if (e.Button == MouseButtons.Left)
                {
                    mouseOff = new Point(-e.X, -e.Y); //记下鼠标移动的偏移量
                    leftFlag = true;                  //点击左键按下时标注为true;  
                }
            }
            catch { }
        }
        //鼠标移动
        private void Form_MouseMove(object sender, MouseEventArgs e)
        {
            try
            {
                if (leftFlag)
                {
                    Point mouseSet = Control.MousePosition;//获取鼠标的位置
                    mouseSet.Offset(mouseOff.X, mouseOff.Y);  //设置移动后的位置  
                    this.Location = mouseSet;//设置当前窗体的位置
                }
            }
            catch { }
        }
        //释放鼠标
        private void Form_MouseUp(object sender, MouseEventArgs e)
        {
            if (leftFlag)
            {
                leftFlag = false;//释放鼠标后标注为false;  
            }
        }

        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();
        [DllImport("user32.dll")]
        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_MOVE = 0xF010;
        public const int HTCAPTION = 0x0002;

        private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            try
            {
                ReleaseCapture();
                SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
            }
            catch { }
        }

        //------------------------end 无边框窗体拖动-----------------------------------  
        #endregion
        /// <summary>
        /// 关闭窗口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }//关闭窗口
        /// <summary>
        /// 最小化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnMin_Click(object sender, EventArgs e)//最小化
        {
            //将窗体最小化
            this.WindowState = FormWindowState.Minimized;
        }
        /// <summary>
        /// 初始化模式1
        /// </summary>
        void InitialModel1()//初始化模式1
        {
            try
            {
                int item = 0;
                //在小时下拉框添加(0~12)选项
                while (item <= 12)
                {
                    cbbHours1.Items.Add(item);
                    cbbHours1.SelectedIndex = 0;
                    item++;
                }
                //在分钟下拉框添加(0~59)选项
                for (item = 0; item <= 0x3b; item++)
                {
                    cbbMins1.Items.Add(item);
                    cbbMins1.SelectedIndex = 0;
                }
                //在秒下拉框添加(0~59)选项
                for (item = 0; item <= 0x3b; item++)
                {
                    cbbSeconds1.Items.Add(item);
                    cbbSeconds1.SelectedIndex = 0;
                }
            }
            catch { }

        }
        /// <summary>
        /// 命令函数 (通过黑窗口执行命令)
        /// </summary>
        /// <param name="str">命令</param>
        private void Cmd(string str)//命令函数
        {
            try
            {
                using (Process process = new Process())
                {
                    process.StartInfo.FileName = "cmd.exe";//调用cmd.exe程序
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.RedirectStandardInput = true;//重定向标准输入
                    process.StartInfo.RedirectStandardOutput = true;//重定向标准输出
                    process.StartInfo.RedirectStandardError = true;//重定向标准出错
                    process.StartInfo.CreateNoWindow = true;//不显示黑窗口
                    process.Start();//开始调用执行
                    process.StandardInput.WriteLine(str + "&exit");//标准输入str + "&exit",相等于在cmd黑窗口输入str + "&exit"
                    process.StandardInput.AutoFlush = true;//刷新缓冲流,执行缓冲区的命令,相当于输入命令之后回车执行
                    process.WaitForExit();//等待退出
                    process.Close();//关闭进程
                }
            }
            catch
            {
            }
        }
        /// <summary>
        /// 模式1确定
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSure1_Click(object sender, EventArgs e)//模式1确定
        {
            try
            {
                string strHour = cbbHours1.Items[cbbHours1.SelectedIndex].ToString();//小时
                string strMin = cbbMins1.Items[cbbMins1.SelectedIndex].ToString();//分钟
                string strSec = cbbSeconds1.Items[cbbSeconds1.SelectedIndex].ToString();//秒数
                if (((cbbHours1.SelectedIndex != 0) || (cbbMins1.SelectedIndex != 0)) || (cbbSeconds1.SelectedIndex != 0))
                {
                    this.Cmd("shutdown -a");//取消之前的关机任务
                    //组织关机命令
                    string strCmd = "shutdown -s -t " + (((((Convert.ToInt32(strHour) * 60) * 60) + (Convert.ToInt32(strMin) * 60)) + Convert.ToInt32(strSec))).ToString();
                    this.Cmd(strCmd);//调用cmd执行命令
                    //弹出消息框告知用户
                    MessageBox.Show("计算机将在" + strHour + "小时" + strMin + "分" + strSec + "秒后关机");
                }
                else
                {
                    MessageBox.Show("选择无效!");
                }
            }
            catch { }

        }
        /// <summary>
        /// 取消关机计划
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancel1_Click(object sender, EventArgs e)//取消关机计划
        {
            this.Cmd("shutdown -a");//调用cmd执行取消关机命令
        }
        /// <summary>
        /// 重启模式
        /// </summary>
        void InitialRset()//初始化重启模式
        {
            try
            {
                int item = 0;
                //在小时下拉框添加(0~12)选项
                while (item <= 12)
                {
                    cbbHoursRset.Items.Add(item);
                    cbbHoursRset.SelectedIndex = 0;
                    item++;
                }
                //在分钟下拉框添加(0~59)选项
                for (item = 0; item <= 0x3b; item++)
                {
                    cbbMinsRset.Items.Add(item);
                    cbbMinsRset.SelectedIndex = 0;
                }
                //在秒下拉框添加(0~59)选项
                for (item = 0; item <= 0x3b; item++)
                {
                    cbbSecondsRset.Items.Add(item);
                    cbbSecondsRset.SelectedIndex = 0;
                }
            }
            catch { }

        }


        /// <summary>
        /// 确认重启
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSureRset_Click(object sender, EventArgs e)//重启模式
        {
            try
            {
                //获取用户选择的时间
                string strHour = cbbHoursRset.Items[cbbHoursRset.SelectedIndex].ToString();//小时
                string strMin = cbbMinsRset.Items[cbbMinsRset.SelectedIndex].ToString();//分钟
                string strSec = cbbSecondsRset.Items[cbbSecondsRset.SelectedIndex].ToString();//秒

                this.Cmd("shutdown -a");//取消之前的关机任务
                //根据用户的选择组织关机命令
                string strCmd = "shutdown -r -t " + (((((Convert.ToInt32(strHour) * 60) * 60) + (Convert.ToInt32(strMin) * 60)) + Convert.ToInt32(strSec))).ToString();
                this.Cmd(strCmd);//调用cmd执行重启命令
                //弹出消息框告知用户
                MessageBox.Show("计算机将在" + strHour + "小时" + strMin + "分" + strSec + "秒后重启");
            }
            catch { }

        }
        /// <summary>
        /// 取消重启
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnCancelRset_Click(object sender, EventArgs e)//取消重启
        {
            this.Cmd("shutdown -a");//取消关机任务
        }

        /// <summary>
        /// 初始化模式2
        /// </summary>
        void InitialModel2()//初始化模式2
        {
            try
            {
                int num;
                this.cbbMonths.Items.Clear();//清空月份下拉框
                //在月份下拉框添加1~12
                for (num = 1; num <= 12; num++)
                {
                    cbbMonths.Items.Add(num);

                }
                //默认选择当前月
                cbbMonths.SelectedIndex = DateTime.Now.Month - 1;

                this.cbbHours2.Items.Clear();//清空小时下拉框
                //在小时下拉框添加0~23
                for (num = 0; num <= 0x17; num++)
                {
                    this.cbbHours2.Items.Add(num);

                }

                //默认选择当前小时
                cbbHours2.SelectedIndex = DateTime.Now.Hour;

                this.cbbMins2.Items.Clear();//清空分钟下拉框、
                //在月份下拉框添加0~59
                for (num = 0; num <= 0x3b; num++)
                {
                    this.cbbMins2.Items.Add(num);

                }
                //默认选择当前秒
                cbbMins2.SelectedIndex = DateTime.Now.Minute;
                SetDay();//根据用户选择的月份选择天数(月份的天数有差异,有润平年之分)
            }
            catch { }

        }

        /// <summary>
        /// 设置模式2天数
        /// </summary>
        void SetDay()//设置模式2天数
        {
            try
            {
                int num;
                this.cbbDays.Items.Clear();//清空天数下拉框
                switch ((cbbMonths.SelectedIndex + 1))
                {
                    case 1://1 3 5 7 8 10 12 月有31天
                    case 3:
                    case 5:
                    case 7:
                    case 8:
                    case 10:
                    case 12: for (num = 1; num <= 31; num++)
                        {
                            cbbDays.Items.Add(num);

                        }
                        break;
                    case 4://4 6 9 11月有30天
                    case 6:
                    case 9:
                    case 11: for (num = 1; num <= 30; num++)
                        {
                            cbbDays.Items.Add(num);

                        }
                        break;
                    case 2: for (num = 1; num <= 28; num++)//2月至少有28天
                        {
                            cbbDays.Items.Add(num);

                        }

                        //闰年 2月 有29天
                        if (((Convert.ToInt32(DateTime.Now.Year) % 400) == 0) || (((Convert.ToInt32(DateTime.Now.Year) % 4) == 0) && ((Convert.ToInt32(DateTime.Now.Year) % 100) != 0)))
                        {
                            cbbDays.Items.Add(0x1d);//再加1天
                        }
                        break;
                    default: break;
                }

                if (Convert.ToInt32(DateTime.Now.Day) > cbbDays.Items.Count)
                {//当前天数大于可选天数,设置为27
                    cbbDays.SelectedIndex = 27;
                }
                else
                {
                    //默认选为当前天数
                    cbbDays.SelectedIndex = Convert.ToInt32(DateTime.Now.Day) - 1;
                }
            }
            catch { }
        }
        /// <summary>
        /// 当月数改变天数随之改变
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbbMonths_SelectedIndexChanged(object sender, EventArgs e)//当月数改变天数随之改变
        {
            SetDay();
        }
        /// <summary>
        /// 获取设置模式2关机时间
        /// </summary>
        /// <returns>设置模式2关机时间</returns>
        private DateTime GetDTime()//获取设置模式2关机时间
        {
            try
            {
                string strYear = Convert.ToString(DateTime.Now.Year);
                string strMouth = this.cbbMonths.Items[this.cbbMonths.SelectedIndex].ToString();
                string strDay = this.cbbDays.Items[this.cbbDays.SelectedIndex].ToString();
                string strHour = this.cbbHours2.Items[this.cbbHours2.SelectedIndex].ToString();
                string strMin = this.cbbMins2.Items[this.cbbMins2.SelectedIndex].ToString();
                //跨年处理
                if ((DateTime.Now.Month == 12) && (this.cbbMonths.SelectedIndex == 0))
                {
                    strYear = (DateTime.Now.Year + 1).ToString();
                }
                //返回设置的时间
                return Convert.ToDateTime(strYear + "-" + strMouth + "-" + strDay + " " + strHour + ":" + strMin + ":00");
            }
            catch
            {
                return DateTime.Now;//返回当前时间
            }

        }
        /// <summary>
        /// 计算模式2 获取离关机还有多少秒
        /// </summary>
        /// <param name="DateTime1">设置的关机时间</param>
        /// <param name="DateTime2">当前时间</param>
        /// <returns></returns>
        private double DateDiff(DateTime DateTime1, DateTime DateTime2)//计算模式2秒数
        {
            try
            {
                if (DateTime1 <= DateTime2)//关机时间必须是大于当前时间
                {
                    return 0.0;
                }
                //返回记录关机的秒数
                return DateTime1.Subtract(DateTime2).Duration().TotalSeconds;
            }
            catch
            {
                return -1.0;
            }
        }
        /// <summary>
        /// 模式2确定
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSure2_Click(object sender, EventArgs e)//模式2确定
        {
            try
            {
                this.Cmd("shutdown -a");//取消之前的关机任务
                DateTime dTime = this.GetDTime();//获取关机时间
                double sec = this.DateDiff(dTime, DateTime.Now);//获取离关机还有多少秒
                //关机时间分为2秒~3天
                if ((sec > 2.0) && (sec < 259200.0))
                {
                    this.Cmd("shutdown -a");//取消之前的关机任务
                    //执行关机命令
                    this.Cmd("shutdown -s -t " + Convert.ToInt32(sec.ToString().Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries)[0]).ToString());
                    //弹出消息框提示用户
                    MessageBox.Show("计算机将于" + this.GetDTime().ToString() + "关机");
                }
                else
                {
                    MessageBox.Show("选择无效!!!");
                }

            }
            catch { }
        }
        /// <summary>
        /// 模式2取消
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancel_Click(object sender, EventArgs e)// 模式2取消
        {
            Cmd("shutdown -a");//取消关机任务
        }
        /// <summary>
        /// 当选项卡为模式2时,重置时间
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)//当选项卡为模式2时,重置时间
        {
            if (tabControl1.SelectedIndex == 1)
            {
                InitialModel2();
            }
        }



    }
    class Win32API //拖动接口
    {
        [DllImport("User32.dll")]
        public static extern bool PtInRect(ref Rectangle r, Point p);
    
    }

}

五、总结

      1、cmd关机相关命令

          取消任务命令:shutdown -a

          重启命令:shutdown -r -t sec         (于sec秒后重启)

          关机命令:shutdown -s -t sec        (于sec秒后关机)

                            at 23:00 shutdown -s        (在23:00执行shutdown -s,即在23:00关机。)

                            at 某个时间 执行某个动作/应用  (win7测试管理员权限)

                       

                        取消at计划(1是ID)

                        

      2、更改应用图标

                               

3、窗体设置为无边框样式之后,就拖动不了了。可以通过监听鼠标动作,在窗体范围内,窗体跟随鼠标的移动。对于贴边其实就是设置窗体的位置。

4、调用第三方程序

                   

                    Process process = new Process()//创建进程
                    process.StartInfo.FileName = exePath;//exePath:调用程序的路径
                    process.Start();//开始调用执行
                    process.WaitForExit();//等待退出
                    process.Close();//关闭进程

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值