C#实现定时关机小应用

 更新时间:2020年6月25日 10:36  点击:2117

C# 定时关机小应用(Winform),供大家参考,具体内容如下

一、简述

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

例子打包:链接

二、效果

三、工程结构及布局视图

四、源文件

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();//关闭进程

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25