
下載地址:
鏈接:https://pan.baidu.com/s/1xbLyWmst29lIN9ss43PlpA
提取碼:0dlf
使用方法:
將要守護的.exe文件拖入即可
using FY; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; using System.Threading; using System.Windows.Forms; namespace DaemonWF { public partial class Form1 : Form { List<processModel> list = new List<processModel>(); ContextMenuStrip strip = new ContextMenuStrip(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.listView1.Columns.Add("路徑", 400, HorizontalAlignment.Left); //一步添加 this.listView1.Columns.Add("狀態", 80, HorizontalAlignment.Left); //一步添加 listView1.View = View.Details; strip.Click += Items1_Click; ReadTxt(); //程序處理 Thread thread1 = new Thread(new ThreadStart(Restart)); thread1.Start(); } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { Environment.Exit(0); } /// <summary> /// 程序處理 /// </summary> public void Restart() { while (true) { try { if (list.Count > 0) { for (int i = 0; i < list.Count; i++) { string exeName = list[i].Path.Split('\\')[list[i].Path.Split('\\').Length - 1].Split('.')[0]; if (list[i].State == 1) { try { if (Process.GetProcessesByName(exeName).Length < 1) { SetText(list[i], 5); Process.Start(list[i].Path); } SetText(list[i], 6); Thread.Sleep(100); } catch (Exception ex) { if (ex.ToString().Contains("系統找不到指定的文件")) { MessageBox.Show("找不到指定的文件:" + list[i].Path + ",請檢查路徑的准確性", "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); list[i].State = 8; SetText(list[i], 8); } else { MessageBox.Show(ex.ToString(), "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } if (list[i].State == 3) { Process[] processes = Process.GetProcesses(); foreach (Process p in processes) { if (p.ProcessName == exeName) { p.Kill(); } SetText(list[i], 7); } if (Process.GetProcessesByName(exeName).Length < 1) { SetText(list[i], 7); } } } } } catch (Exception ex) { if (ex.ToString().Contains("系統找不到指定的文件")) { MessageBox.Show("系統找不到指定的文件,請檢查路徑的准確性", "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { MessageBox.Show(ex.ToString(), "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } Thread.Sleep(3000); } } private void Form1_DragDrop(object sender, DragEventArgs e) { string path = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString(); if (path.Split('.')[path.Split('.').Length - 1].ToUpper() != "EXE") { MessageBox.Show(path + "不是可執行程序"); return; } for (int i = 0; i < list.Count; i++) { if (list[i].Path == path) { MessageBox.Show(path + "已存在!"); return; } } list.Add(new processModel() { Path = path, State = 1 }); this.listView1.BeginUpdate(); //數據更新,UI暫時掛起,直到EndUpdate繪制控件,可以有效避免閃爍並大大提高加載速度 ListViewItem lvi = new ListViewItem(); lvi.Text = path; lvi.SubItems.Add("正在啟動"); this.listView1.Items.Add(lvi); this.listView1.EndUpdate(); //結束數據處理,UI界面一次性繪制。 } private void Form1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Link; else e.Effect = DragDropEffects.None; } private void listView1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { if (true)//看看是否過濾當前狀態 { string state = listView1.FocusedItem.SubItems[1].Text; strip.Items.Clear(); if (state == "啟動成功" || state == "正在啟動" || state == "開始監控") { strip.Items.Add("停止監控"); strip.Items.Add("關閉進程"); strip.Items.Add("刪除監控"); } else if (state == "停止監控") { strip.Items.Add("開始監控"); strip.Items.Add("關閉進程"); strip.Items.Add("刪除監控"); } else if (state == "正在關閉" || state == "關閉成功") { strip.Items.Add("開始監控"); strip.Items.Add("刪除監控"); } else if (state == "啟動失敗") { strip.Items.Add("開始監控"); strip.Items.Add("刪除監控"); } } strip.Show(listView1, e.Location);//鼠標右鍵按下彈出菜單 } } private void Items1_Click(object sender, EventArgs e) { foreach (ToolStripItem items in strip.Items) { if (items.Selected == true) { switch (items.Text) { case "開始監控": listView1Select(1); break; case "停止監控": listView1Select(2); break; case "關閉進程": listView1Select(3); break; case "刪除監控": listView1Select(4); break; default: break; } } } } public void listView1Select(int op) { string path = listView1.FocusedItem.SubItems[0].Text; listView1.FocusedItem.SubItems[1].Text = GetState(op); for (int i = 0; i < list.Count; i++) { if (list[i].Path == path) { if (op == 4) { listView1.Items.Remove(listView1.FocusedItem); list.Remove(list[i]); } else { list[i].State = op; if (op == 1) { listView1.FocusedItem.SubItems[1].Text = GetState(5); } } } } } public string GetState(int op) { switch (op) { case 1: return "開始監控"; case 2: return "停止監控"; case 3: return "正在關閉"; case 4: return "刪除監控"; case 5: return "正在啟動"; case 6: return "啟動成功"; case 7: return "關閉成功"; case 8: return "啟動失敗"; default: return "OP碼有誤"; } } public void SetText(processModel model, int op) { this.BeginInvoke(new Action(() => { try { for (int j = 0; j < listView1.Items.Count; j++) { if (listView1.Items[j].SubItems[0].Text == model.Path) { listView1.Items[j].SubItems[1].Text = GetState(op); } } } catch (Exception ex) { RBILogs.WriteLog("error", ex.ToString()); } })); } /// <summary> /// 讀取歷史監控記錄 /// </summary> public void ReadTxt() { string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "Logs\\" + "FY.txt"; StreamReader sr = new StreamReader(path, Encoding.Default); string line; while ((line = sr.ReadLine()) != null) { if (!string.IsNullOrEmpty(line)) { list.Add(new processModel() { Path = line, State = 1 }); this.listView1.BeginUpdate(); //數據更新,UI暫時掛起,直到EndUpdate繪制控件,可以有效避免閃爍並大大提高加載速度 ListViewItem lvi = new ListViewItem(); lvi.Text = line; lvi.SubItems.Add("正在啟動"); this.listView1.Items.Add(lvi); this.listView1.EndUpdate(); //結束數據處理,UI界面一次性繪制。 } } sr.Close(); } /// <summary> /// 關閉程序記錄監控程序路徑 /// </summary> public void WriteFY() { string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "Logs\\" + "FY.txt"; FileStream fs = new FileStream(path, FileMode.Truncate, FileAccess.ReadWrite); fs.Close(); for (int i = 0; i < list.Count; i++) { RBILogs.WriteLog2(list[i].Path); } } /// <summary> /// 添加雙擊托盤圖標事件(雙擊顯示窗口) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { if (WindowState == FormWindowState.Minimized) { //還原窗體顯示 WindowState = FormWindowState.Normal; //激活窗體並給予它焦點 this.Activate(); //任務欄區顯示圖標 this.ShowInTaskbar = true; //托盤區圖標隱藏 notifyIcon1.Visible = false; } } /// <summary> /// 判斷是否最小化,然后顯示托盤 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_SizeChanged(object sender, EventArgs e) { //判斷是否選擇的是最小化按鈕 if (WindowState == FormWindowState.Minimized) { //隱藏任務欄區圖標 this.ShowInTaskbar = false; //圖標顯示在托盤區 notifyIcon1.Visible = true; } } /// <summary> /// 確認是否退出 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("是否確認退出程序?", "退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { WriteFY(); // 關閉所有的線程 this.Dispose(); this.Close(); Environment.Exit(0); } else { e.Cancel = true; } } /// <summary> /// 托盤右鍵顯示主界面 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 顯示ToolStripMenuItem_Click(object sender, EventArgs e) { WindowState = FormWindowState.Normal; } /// <summary> /// 托盤右鍵退出程序 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) { if (MessageBox.Show("是否確認退出程序?", "退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { WriteFY(); // 關閉所有的線程 this.Dispose(); this.Close(); Environment.Exit(0); } } } } /// <summary> /// 進程處理Model /// </summary> public class processModel { public string Path { get; set; } // 1開始監控 2停止監控 3關閉進程 4刪除監控 5正在啟動 6啟動成功 7關閉成功 public int State { get; set; } }