一朋友懒,说想整个定时开关机的小工具,让我帮忙。然后我就弄了。这工具挺简单的,我准备以后也上传平时写的小工具,混积分下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