C# 制作一个定时关机小软件

一朋友懒,说想整个定时开关机的小工具,让我帮忙。然后我就弄了。这工具挺简单的,我准备以后也上传平时写的小工具,混积分下CSDN的程序。
这工具的功能就是,每天在固定的两个时间点进行关机操作。至于如何让它自启动,我没有去想办法,只是让他扔去windows的开机启动里面。
还有这玩意儿我就没想过让它能退出,强制不给关。下面开始说正文。
①在vs2017创建一个winform窗体
在这里插入图片描述
②增加一个app.config,里面增加配置节点信息

   <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key ="程序关机时间" value="17:20;16:00"/>
    <add key ="程序提前多少分钟提示" value="20"/>
  </appSettings>
</configuration>
③添加找到的关机类clsPCDown.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.Configuration;
using System.Runtime.InteropServices;

namespace 定时关机程序
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
        }
        private string strChengXuGuanJiShiJian = "";
        private string strTiQianShiJian = "";
        private bool blnStart = true;
        private bool blnUseFull = true;
        private void Form1_Load(object sender, EventArgs e)
        {
            //读取app.config的设置
            strChengXuGuanJiShiJian = ConfigurationSettings.AppSettings["程序关机时间"].ToString();
            strChengXuGuanJiShiJian = strChengXuGuanJiShiJian.Replace(";", ";").Replace(":", ":");//替换中文字符的分号和冒号
            strChengXuGuanJiShiJian = strChengXuGuanJiShiJian.TrimEnd(';');//去掉尾部多余的分号
            strTiQianShiJian = ConfigurationSettings.AppSettings["程序提前多少分钟提示"].ToString();
            //聚焦 忽略按钮
            this.button3.Focus();
        }

        private void timer1_Tick(object sender, EventArgs e)//时间间隔1000毫秒执行一次
        {
            //程序第一次运行的时候,直接不显示窗体
            if (blnStart)
            {
                //程序运行的时候,直接不显示窗体
                m_mthDisShow();
                blnStart = false;
            }

            //显示当前时间到窗体中
            DateTime dtmNow = DateTime.Now;//将当前时间存入变量,避免下面处理时间的时候,时间不一致
            this.lblCurrentTime.Text = dtmNow.ToString("yyyy年MM月dd日 HH时mm分ss秒");//格式化显示的时间
            //计算距离关机还要多少分钟
            DateTime dtmTarge = DateTime.Parse(dtmNow.ToString("yyyy-MM-dd ") + m_strGetGuanJiShiJian());//关机时间,app.config只存了时分秒,所以要转换一下
            TimeSpan ts = dtmTarge - dtmNow;//关机时间-当前时间得到间隔
            double dblShengYuMiao = ts.TotalSeconds;
            if (dblShengYuMiao < 0)//超过关机时间,重置取消关机的状态
            {
                dblShengYuMiao = 24 * 60 * 60 + dblShengYuMiao;
                blnUseFull = true;
            }
            int intShengYuFenZhong = (int)(dblShengYuMiao / 60);
            int intShengYuMiao = (int)(dblShengYuMiao) % 60;
            
            if((intShengYuFenZhong <= int.Parse(strTiQianShiJian) )&& blnUseFull==true)//剩余分钟在提示的时间范围内则执行
            {
                if (this.Visible == false)//窗体不可见的时候,就显示窗体
                {
                    m_mthShow();
                }
            }


            this.lblShengYuFenZhong.Text = intShengYuFenZhong.ToString();
            this.lblMiao.Text = intShengYuMiao.ToString();
            if(intShengYuFenZhong == 0 && intShengYuMiao == 0 && blnUseFull == true)//剩余时间为0,并且没有点过取消关机,因为上面会重置时间,所以只会执行一次关机操作
            {
                m_mthClosePC();
            }

        }
      
        private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)//鼠标单击或者双击都走这里
        {
            //不增加退出功能,除非自己结束系统进程
            if(this.WindowState == FormWindowState.Normal && this.Visible == true )//窗体当前状态如果是正常显示并且可见,则隐藏
            {
                m_mthDisShow();
            }
            else if(this.Visible == false)//窗体不可见的时候,就显示窗体
            {
                m_mthShow();
            }
        }
        /// <summary>
        /// 不显示窗体,同事显示小图标
        /// </summary>
        private void m_mthDisShow()
        {
            this.notifyIcon1.Visible = true;//在通知区显示窗体的Icon
            this.WindowState = FormWindowState.Minimized;//将窗体设置成最小化
            this.Visible = false;//设置主窗体不可见
            this.ShowInTaskbar = false;//使Form不在任务栏上显示
            this.Hide();
        }
        /// <summary>
        /// 显示窗体
        /// </summary>
        private void m_mthShow()
        {
            
                this.Show();
                this.WindowState = FormWindowState.Normal;
                this.Activate();
            
        }

        private void button3_Click(object sender, EventArgs e)
        {
            m_mthDisShow();
        }
     
       
        private string m_strGetGuanJiShiJian()
        {
            string strResult = "";
            if(strChengXuGuanJiShiJian.Contains(";"))//时间是多个,则要分隔,并且找到对的关机时间
            {
                //先分隔字符串,得到正确的时间
                DateTime dtmNow = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:00"));
                string[] strShiJianArr = strChengXuGuanJiShiJian.Split(';');//以分号分隔字符串,得到时间点
                //对这个数组排序,因为是时间格式,所以需要转换成datetime排序,这里使用冒泡排序,从小到大排序
                for(int i =0;i<strShiJianArr.Length-1;i++)
                {
                    for(int j = 0;j<strShiJianArr.Length-i-1;j++)
                    {
                        DateTime dtm1 = DateTime.Parse(dtmNow.ToString("yyyy-MM-dd " + strShiJianArr[j]));
                        DateTime dtm2 = DateTime.Parse(dtmNow.ToString("yyyy-MM-dd " + strShiJianArr[j+1]));
                        if(dtm1 > dtm2)//交换
                        {
                            string strTemp = strShiJianArr[j + 1];
                            strShiJianArr[j + 1] = strShiJianArr[j];
                            strShiJianArr[j] = strTemp;
                        }
                    }
                }
                //判断当前时间在哪个时间间隔里面
                bool blnHasFind = false;
                for(int i =0;i<strShiJianArr.Length;i++)
                {
                    if(dtmNow <= DateTime.Parse(dtmNow.ToString("yyyy-MM-dd " + strShiJianArr[i])))
                    {
                        blnHasFind = true;
                        strResult = strShiJianArr[i];
                        break;
                    }
                }
                //如果都不在,则取第一个
                if (blnHasFind == false)
                    strResult = strShiJianArr[0];
            }
            else
            {
                strResult = strChengXuGuanJiShiJian;
            }
            return strResult;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            m_mthClosePC();
        }
        private void m_mthClosePC()
        {
            //MessageBox.Show("guanji");
            //return;
            clsPCDown clsPcControl = new clsPCDown();
            clsPcControl.ShutDown();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if(MessageBox.Show("是否取消当天的自动关机?","提示!",MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                //聚焦 忽略按钮
                this.button3.Focus();
                blnUseFull = false;
                m_mthDisShow();
            }

            
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            MessageBox.Show("本程序拒绝关闭,请单击“忽略”按钮隐藏!");
            e.Cancel = true;
        }
    }
}

刚才上传代码上去,现在在审核,过了之后我再发链接出来
http://download.csdn.net/download/a47449774/12165451

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值