C#托盘控制服务

如下图为托盘控制一个服务


实现步奏

1在Winform中做出如下控件

3App.config设置

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
    </startup>
  <appSettings>
    <add key="Name" value="ServiceMyTesthh"/>
  </appSettings>
</configuration>

4代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using WinServicesControl;

namespace ServiceController
{
    public partial class PalletControl : Form
    {
        static System.ServiceProcess.ServiceController sc;
        String Str_Name = ConfigurationManager.AppSettings["Name"].ToString();
        String[] m_time = { "AllData", "3" };
        public PalletControl()
        {
            InitializeComponent();
        }

        // 加载
        private void PalletControl_Load(object sender, EventArgs e)
        {
            this.Hide();
            this.ShowInTaskbar = false;
            Initialize();
        }

        private void Initialize()
        {
            sc = new System.ServiceProcess.ServiceController(Str_Name);
            bool m_serveiceIsExisted = ClServCtl.ServiceIsExisted(Str_Name);
            if (!m_serveiceIsExisted)
            {
                foreach (var MeanuStrip in cms.Items)
                {
                    if (MeanuStrip is ToolStripMenuItem)
                    {
                        if ((MeanuStrip as ToolStripMenuItem).Name != "InstallationServices" && 
                            (MeanuStrip as ToolStripMenuItem).Name != "CheckServices"
                            && (MeanuStrip as ToolStripMenuItem).Name != "tsmiExit")
                        {
                            (MeanuStrip as ToolStripMenuItem).Enabled = false;
                        }

                    }
                }
            }
            else
            {
                foreach (var MeanuStrip in cms.Items)
                {
                    if (MeanuStrip is ToolStripMenuItem)
                    {
                        if ((MeanuStrip as ToolStripMenuItem).Name == "InstallationServices")
                        {
                            (MeanuStrip as ToolStripMenuItem).Enabled = false;
                        }

                    }
                }
                //更新菜单列表
                GetServiceState();
            }
        }

        #region 功能

        //退出
        private void tsmiExit_Click(object sender, EventArgs e)
        {
            System.Windows.Forms.Application.Exit();
        }

        //停止
        private void tsmiStopService_Click(object sender, EventArgs e)
        {
            if (sc.Status == System.ServiceProcess.ServiceControllerStatus.Running && sc.CanStop == true)
            {
                try
                {
                    sc.Stop();
                    Thread.Sleep(500);
                    //更新菜单列表
                    GetServiceState();
                }
                catch (System.Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
                }
            }
        }

        //继续
        private void tsmiContiuneService_Click(object sender, EventArgs e)
        {
            StartString(m_time);
        }

        // 根据服务当前状态更新菜单
        private void GetServiceState()
        {
            try
            {
                sc.Refresh();
                switch (sc.Status)
                {
                    case System.ServiceProcess.ServiceControllerStatus.Stopped:
                        {
                            //ntfiService.Icon = new System.Drawing.Icon("stopped.ico");
                            cms.Items[0].Enabled = true;
                            cms.Items[1].Enabled = false;
                            break;
                        }
                    case System.ServiceProcess.ServiceControllerStatus.Running:
                        {
                            //ntfiService.Icon = new System.Drawing.Icon("started.ico");
                            cms.Items[0].Enabled = false;
                            cms.Items[1].Enabled = true;
                            break;
                        }
                    default:
                        {
                            break;
                        }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                System.Windows.Forms.Application.Exit();
            }

        }

        // 显示服务当前状态
        private void tsmiStatus_Click(object sender, EventArgs e)
        {
            GetServiceState();
            System.Windows.Forms.MessageBox.Show(sc.Status.ToString(), "服务状态");
        }

        //安装服务
        private void InstallationServices_Click(object sender, EventArgs e)
        {

            String str_path = System.AppDomain.CurrentDomain.BaseDirectory;
            str_path = str_path.Replace("\\bin\\Debug\\", "");
            str_path += @"\SDWindowsService\MyTestWindowsService\bin\Debug\InstallUtilServices.bat";
            str_path.Trim();
            String MeaanuStripName = "InstallationServices";
            ForeachMenuItem(MeaanuStripName);
            //String patch = @"D:\demo\同步数据库托盘服务\ServiceController\ServiceController\SDWindowsService\MyTestWindowsService\bin\Debug\InstallUtilServices.bat";
            RunBat(str_path);
            //更新菜单列表
            GetServiceState();
        }

        //卸载服务
        private void Unloading_Click(object sender, EventArgs e)
        {
            String str_path = System.AppDomain.CurrentDomain.BaseDirectory;//.Replace("\\bin\\Debug\\", "") + @"\SDWindowsService\MyTestWindowsService\bin\Debug\UpLoadIngServices.bat";
            str_path = str_path.Replace("\\bin\\Debug\\", "");
            str_path += @"\SDWindowsService\MyTestWindowsService\bin\Debug\UpLoadIngServices.bat";
            str_path.Trim();
            String MeaanuStripName = "Unloading";
            ForeachMenuItem(MeaanuStripName);
            // String patch = @"D:\demo\同步数据库托盘服务\ServiceController\ServiceController\SDWindowsService\MyTestWindowsService\bin\Debug\UpLoadIngServices.bat";
            RunBat(str_path);

        }

        //检查服务是否安装
        private void CheckServices_Click(object sender, EventArgs e)
        {
            bool m_serveiceIsExisted = ClServCtl.ServiceIsExisted(Str_Name);
            if (m_serveiceIsExisted)
            {
                MessageBox.Show(Str_Name + "服务已安装");
            }
            else
            {
                MessageBox.Show(Str_Name + "服务未安装");
            }
        }

        #endregion

        #region 数据时间选择

        //最近三天
        private void ThreeDay_Click(object sender, EventArgs e)
        {
            //m_time = { "ThreeDay", "3"};
            m_time[0] = "ThreeDay";
            m_time[1] = "3000";
            StartString(m_time);
        }

        //最近一周
        private void OneWeek_Click(object sender, EventArgs e)
        {
            // String[] m_time = { "OneWeek","3" };
            m_time[0] = "OneWeek";
            m_time[1] = "3000";
            StartString(m_time);
        }

        //最近一个月
        private void OneMounth_Click(object sender, EventArgs e)
        {
            //String[] m_time = { "OneMounth" ,"3"};
            m_time[0] = "OneMounth";
            m_time[1] = "3000";
            StartString(m_time);
        }

        //最近三个月
        private void ThreeMounth_Click(object sender, EventArgs e)
        {
            //String[] m_time = { "ThreeMounth" ,"3"};
            m_time[0] = "ThreeMounth";
            m_time[1] = "3000";
            StartString(m_time);
        }

        //所有数据
        private void AllData_Click(object sender, EventArgs e)
        {
            //String[] m_time = { "Alldata" };
            m_time[0] = "ThreeMounth";
            m_time[1] = "3000";
            StartString(m_time);
        }

        #endregion

        #region Timer时间间隔
        //设置时间间隔为1秒
        private void OneSecond_Click(object sender, EventArgs e)
        {
            m_time[1] = "1000";
            StartString(m_time);
        }

        //设置时间间隔为3秒
        private void TwoSecond_Click(object sender, EventArgs e)
        {
            m_time[1] = "3000";
            StartString(m_time);
        }

        //设置时间间隔为5秒
        private void ThreeSecond_Click(object sender, EventArgs e)
        {
            m_time[1] = "5000";
            StartString(m_time);
        }

        //设置时间间隔为60秒
        private void SixtySeconds_Click(object sender, EventArgs e)
        {
            m_time[1] = "60000";
            StartString(m_time);
        }

        #endregion


        #region Click
        private void OpenFileRoute_Click(object sender, EventArgs e)
        {
            string filepath = "";
            string filename = ClServCtl.GetFilePath(Str_Name);
            if (filename == "")
            {
                MessageBox.Show("操作失败,没有找到路径");
                return;
            }
            for (int i = filename.Length - 1; i > 0; i--)
            {
                if (filename.Substring(i, 1) == @"\")
                {
                    filepath = filename.Substring(0, i);
                    break;
                }
            }
            try
            {
                System.Diagnostics.Process.Start("explorer.exe", filepath);
            }
            catch
            {
                MessageBox.Show("操作失败,没有找到合法路径");
            }
        }

        private void AddToSystemStartup_Click(object sender, EventArgs e)
        {
            if (ClServCtl.SetAutoRun("AutoRun" + Str_Name, Application.ExecutablePath))
            {
                MessageBox.Show("操作成功");
            }
            else
            {
                MessageBox.Show("操作失败");
            }
        }

        private void CancalSystemStartup_Click(object sender, EventArgs e)
        {
            ClServCtl.DeleteAutoRun("AutoRun" + Str_Name);
        }

        private void Swlf_motion_Click(object sender, EventArgs e)
        {
            ClServCtl.SetServRunType(Str_Name, 2);
        }

        private void ManualOperation_Click(object sender, EventArgs e)
        {
            ClServCtl.SetServRunType(Str_Name, 3);
        }

        private void Forbidden_Click(object sender, EventArgs e)
        {
            ClServCtl.SetServRunType(Str_Name, 4);
        }
        #endregion

        #region funshion
        private void StartString(String[] m_time)
        {
            if (sc.Status == System.ServiceProcess.ServiceControllerStatus.Stopped)
            {
                try
                {
                    sc.Start(m_time);
                    Thread.Sleep(500);
                    //更新菜单列表
                    GetServiceState();
                }
                catch (System.Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
                }
            }
            else if (sc.Status == System.ServiceProcess.ServiceControllerStatus.Running)
            {
                try
                {
                    sc.Stop();
                    Thread.Sleep(500);
                    sc.Start(m_time);
                    Thread.Sleep(500);
                    //更新菜单列表
                    GetServiceState();
                }
                catch (System.Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
                }
            }
        }

        private void RunBat(String batPath)
        {
            Process pro = new Process();

            FileInfo file = new FileInfo(batPath);
            pro.StartInfo.WorkingDirectory = file.Directory.FullName;
            pro.StartInfo.FileName = batPath;
            pro.StartInfo.CreateNoWindow = false;
            pro.Start();
            pro.WaitForExit();
        }
        private void ForeachMenuItem(String MeaanuStripName)
        {
            if (MeaanuStripName == "InstallationServices")
            {
                foreach (var MeanuStrip in cms.Items)
                {
                    if (MeanuStrip is ToolStripMenuItem)
                    {
                        if ((MeanuStrip as ToolStripMenuItem).Name != MeaanuStripName)
                        {
                            (MeanuStrip as ToolStripMenuItem).Enabled = true;
                        }
                        else
                        {
                            (MeanuStrip as ToolStripMenuItem).Enabled = false;
                        }

                    }
                }
            }
            else
            {
                foreach (var MeanuStrip in cms.Items)
                {
                    if (MeanuStrip is ToolStripMenuItem)
                    {
                        if ((MeanuStrip as ToolStripMenuItem).Name == "InstallationServices" ||
                            (MeanuStrip as ToolStripMenuItem).Name == "CheckServices" ||
                            (MeanuStrip as ToolStripMenuItem).Name == "tsmiExit")
                        {
                            (MeanuStrip as ToolStripMenuItem).Enabled = true;
                        }
                        else
                        {
                            (MeanuStrip as ToolStripMenuItem).Enabled = false;
                        }

                    }
                }
            }

        }

        #endregion
    }
}

类代码
 using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceProcess;
using Microsoft.Win32;


namespace WinServicesControl
{
    static  class  ClServCtl
    {
       // static System.ServiceProcess.ServiceController sc;
        /// <summary>
        /// 设置服务的启动方式
        /// </summary>
        /// <param name="key">2自动,3手动,4禁用</param>
        /// <returns></returns>
        public static bool SetServRunType(string servname, int k)
        {
            try
            {
                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\" + servname, true);
                key.SetValue("Start", k);
                key.Close();
            }
            catch { return false; }
            return true;
        }

        /// <summary>
        /// 获得服务的启动方式
        /// </summary>
        /// <returns></returns>
        public static string GetServRunType(string servname)
        {
            string runtype="";
            try
            {                
                RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\" + servname, true);
                runtype = key.GetValue("Start").ToString();
                key.Close();
                switch (runtype)
                {
                    case"2":
                        runtype = "自动";
                        break;
                    case "3":
                        runtype = "手动";
                        break;
                    case "4":
                        runtype = "禁用";
                        break;
                }
            }
            catch { }
            return runtype;
        }


        /// <summary>
        /// 把本应用程序添加到系统启动项
        /// </summary>
        /// <param name="keyName"></param>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static bool SetAutoRun(string keyName, string filePath)
        {
            try
            {
                RegistryKey runKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
                runKey.SetValue(keyName, filePath);
                runKey.Close();
            }
            catch
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// 取消系统启动项
        /// </summary>
        /// <param name="keyName"></param>
        /// <returns></returns>
        public static bool DeleteAutoRun(string keyName)
        {
            try
            {
                RegistryKey runKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
                //runKey.DeleteSubKey(keyName,true);
                runKey.SetValue(keyName, "");
                runKey.Close();
            }
            catch
            {
                return false;
            }
            return true;
        }


        /// <summary>
        /// 获取服务的可执行文件路径
        /// </summary>
        /// <param name="servername"></param>
        /// <returns></returns>
        public static string GetFilePath(string servername)
        {
            RegistryKey _Key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\ControlSet001\Services\" + servername);
            if (_Key != null)
            {
                object _ObjPath = _Key.GetValue("ImagePath");
                if (_ObjPath != null)
                    return _ObjPath.ToString();
            }
            return "";            
        }


        /// <summary>
        /// 获取一个服务的状态
        /// </summary>
        /// <param name="ServName"></param>
        /// <returns></returns>
        public static string GetServState(string servername)
        {
            try
            {
                System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(servername);
                return sc.Status.ToString();
            }
            catch
            { 
                
                return "";
            }
        }
        /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="servername"></param>
        /// <returns></returns>
        public static bool RunService(string servername)
        {
            try
            {
                System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(servername);
                ServiceControllerStatus st = sc.Status;
                switch (st)
                {
                    case ServiceControllerStatus.Running:
                    case ServiceControllerStatus.StartPending:
                    case ServiceControllerStatus.Paused:
                    case ServiceControllerStatus.PausePending:
                    case ServiceControllerStatus.ContinuePending:
                        sc.Stop();
                        sc.WaitForStatus(ServiceControllerStatus.Stopped);
                        sc.Start();
                        break;
                    case ServiceControllerStatus.StopPending:
                    case ServiceControllerStatus.Stopped:
                        sc.Start();
                        break;
                    default: break;
                }
                sc.WaitForStatus(ServiceControllerStatus.Running);
                st = sc.Status;//再次获取服务状态
                if (st == ServiceControllerStatus.Running)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch { return false; }
        }
        /// <summary>
        /// 停止服务
        /// </summary>
        /// <param name="servername"></param>
        /// <returns></returns>
        public static bool StopService(string servername)
        {
            try
            {
                System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(servername);
                ServiceControllerStatus st = sc.Status;
                switch (st)
                {
                    case ServiceControllerStatus.Running:
                    case ServiceControllerStatus.StartPending:
                    case ServiceControllerStatus.Paused:
                    case ServiceControllerStatus.PausePending:
                    case ServiceControllerStatus.ContinuePending:
                        sc.Stop();
                        sc.WaitForStatus(ServiceControllerStatus.Stopped);
                        break;
                }
                st = sc.Status;//再次获取服务状态
                if (st == ServiceControllerStatus.Stopped)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch { return false; }
        }
        /// <summary>
        /// 暂停服务
        /// </summary>
        /// <param name="servername"></param>
        /// <returns></returns>
        public static bool PauseService(string servername)
        {
            try
            {
                System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(servername);
                ServiceControllerStatus st = sc.Status;
                switch (st)
                {
                    case ServiceControllerStatus.Running:
                    case ServiceControllerStatus.StartPending:
                        sc.Pause();
                        sc.WaitForStatus(ServiceControllerStatus.Paused);
                        break;
                }
                st = sc.Status;//再次获取服务状态
                if (st == ServiceControllerStatus.Paused)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch { return false; }
        }
        /// <summary>
        /// 恢复暂停的服务
        /// </summary>
        /// <param name="servername"></param>
        /// <returns></returns>
        public static bool ResumeService(string servername)
        {
            try
            {
                System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(servername);
                ServiceControllerStatus st = sc.Status;
                switch (st)
                {
                    case ServiceControllerStatus.Paused:
                    case ServiceControllerStatus.PausePending:
                        sc.Continue();
                        sc.WaitForStatus(ServiceControllerStatus.Running);
                        break;
                }
                st = sc.Status;//再次获取服务状态
                if (st == ServiceControllerStatus.Running)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch { return false; }
        }


        #region 判断window服务是否存在
        /// <summary>
        /// 判断服务是否存在
        /// </summary>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        public static  bool ServiceIsExisted(string serviceName)
        {
            System.ServiceProcess.ServiceController[] services = System.ServiceProcess.ServiceController.GetServices();
            foreach (System.ServiceProcess.ServiceController s in services)
            {
                if (s.ServiceName == serviceName)
                {
                    return true;
                }
            }
            return false;
        }
        #endregion  
    }
}

完成后在App.config里输入服务名称就可以了

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值