1、新建一个WinForm工程。点击【新建项目】弹出新建项目窗口,在C#模板下选择【WinForm应用程序】,输入项目名称:OpenProcess,点击【确定】
2、在Form1.Designer.cs页面中找到partial class Form1{……}整段代码,即图中框选区域代码,用下面代码进行替换。 partial class Form1 { /// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源。 /// </summary> /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows 窗体设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.timer1 = new System.Windows.Forms.Timer(this.components); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(13, 13); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(218, 32); this.button1.TabIndex = 0; this.button1.Text = "打开计算器"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 // this.button2.Location = new System.Drawing.Point(15, 61); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(215, 34); this.button2.TabIndex = 1; this.button2.Text = "启动自动关机"; this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // // timer1 // this.timer1.Tick += new System.EventHandler(this.timer1_Tick); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(241, 261); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); } #endregion private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.Timer timer1; }
3、在Form1页面中找到public partial class Form1 : Form{……}整段代码,即图中框选区域代码,用下面代码进行替换。 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private static Dictionary<string, System.Diagnostics.Process> Procs = new Dictionary<string, System.Diagnostics.Process>(); private DateTime shutdowntime; private static System.Diagnostics.Process OpenFileName(string FileName, string Arguments) { System.IO.FileInfo f = new System.IO.FileInfo(FileName); if (!f.Exists) { return null; } FileName = f.FullName; string WorkingDirectory = System.IO.Path.GetDirectoryName(f.FullName); string filename = f.Name; //声明一个程序信息类 System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo(); //设置外部程序名 Info.FileName = filename; //设置外部程序的启动参数(命令行参数)为test.txt Info.Arguments = Arguments; //设置外部程序工作目录为 C:\ Info.WorkingDirectory = WorkingDirectory; try { //声明一个程序类 // //启动外部程序 // if (!Procs.ContainsKey(FileName)) { Procs[FileName] = System.Diagnostics.Process.Start(Info); } else { try { DateTime dt = Procs[FileName].ExitTime; DateTime now = DateTime.Now; TimeSpan ts = now - dt; if (ts.Milliseconds > 0) { Procs[FileName] = System.Diagnostics.Process.Start(Info); } } catch { } } } catch (System.ComponentModel.Win32Exception ea) { return null; } return Procs[FileName]; } private static void ColseFileName(string FileName) { System.IO.FileInfo f = new System.IO.FileInfo(FileName); if (!f.Exists) { return; } FileName = f.FullName; System.Diagnostics.Process Proc = null; if (Procs.ContainsKey(FileName)) { Proc = Procs[FileName]; } else { //没有关联启动程序 return; } //打印出外部程序的开始执行时间 //Console.WriteLine("外部程序的开始执行时间:{0}", Proc.StartTime); DateTime StartTime = Proc.StartTime; DateTime now = DateTime.Now; TimeSpan ts = now - StartTime; if (ts.Milliseconds < 3000) { //System.Windows.Forms.MessageBox.Show("操作过于频繁,程序启动不足3秒钟"); //等待3秒钟 //Proc.WaitForExit(3000); } //如果这个外部程序没有结束运行则对其强行终止 if (Proc.HasExited == false) { //Console.WriteLine("由主程序强行终止外部程序的运行!"); Proc.Kill(); } else { //Console.WriteLine("由外部程序正常退出!"); } //Console.WriteLine("外部程序的结束运行时间:{0}", Proc.ExitTime); //Console.WriteLine("外部程序在结束运行时的返回值:{0}", Proc.ExitCode); bool ExitYes = true; while (ExitYes) { try { DateTime dt = Procs[FileName].ExitTime; now = DateTime.Now; ts = now - dt; if (ts.Milliseconds > 50) { ExitYes = false; Procs.Remove(FileName); } } catch { //System.Threading.Thread.Sleep(100); } } } private void button1_Click(object sender, EventArgs e) { if (button1.Text == "打开计算器") { OpenFileName(@"C:\Windows\System32\Calc.exe", ""); button1.Text = "关闭计算器"; } else { ColseFileName(@"C:\Windows\System32\Calc.exe"); button1.Text = "打开计算器"; } } private void button2_Click(object sender, EventArgs e) { if (button2.Text == "启动1小时后自动关机") { OpenFileName(@"C:\Windows\System32\shutdown.exe", "-s -t 3600"); button2.Text = "中断1小时后自动关机"; this.shutdowntime = DateTime.Now+new TimeSpan(1,0,0) ; timer1.Enabled = true; } else { timer1.Enabled = false; ColseFileName(@"C:\Windows\System32\shutdown.exe"); button2.Text = "启动1小时后自动关机"; } } private void timer1_Tick(object sender, EventArgs e) { TimeSpan tp= this.shutdowntime-DateTime.Now; string str= tp.Hours.ToString ()+"小时"+ tp.Minutes .ToString ()+"分"+tp.Seconds .ToString ()+"秒"; button2.Text = "中断"+str+"后自动关机"; } }
4、编译代码,生成解决方案。按F5执行
5、点击【打开计算器】,可以发现计算器被打开,然后点击【关闭计算器】,计算器程序则被关闭
6、点击【启动自动关机】,计算机将在1小时后自动关机。