• [转]用托盘控制windows服务的c#实现



    代码
    using System;

    namespace UBISerialsController
    {
     
    /// <summary>
     
    /// Class1 的摘要说明。
     
    /// </summary>
     public class Class1
     {
      
    static System.ServiceProcess.ServiceController sc;
      
    static System.Windows.Forms.NotifyIcon ni;
      
    static System.Windows.Forms.ContextMenu cm;
      
    static System.Timers.Timer timer;

      
    public Class1()
      {
       
    //
       
    // TODO: 在此处添加构造函数逻辑
       
    //
       
      }

      
    static void Main()
      {
       
    try
       {
        sc
    =new System.ServiceProcess.ServiceController("UBISerials");
        ni
    =new System.Windows.Forms.NotifyIcon();
        ni.Visible
    =false;
        cm
    =new System.Windows.Forms.ContextMenu();
        cm.MenuItems.Add(
    new System.Windows.Forms.MenuItem("停止",new EventHandler(StopService)));
        cm.MenuItems.Add(
    new System.Windows.Forms.MenuItem("暂停",new EventHandler(PauseService)));
        cm.MenuItems.Add(
    new System.Windows.Forms.MenuItem("继续",new EventHandler(ContiuneService)));
        cm.MenuItems.Add(
    new System.Windows.Forms.MenuItem("开始",new EventHandler(StartService)));
        cm.MenuItems.Add(
    "-");
        cm.MenuItems.Add(
    new System.Windows.Forms.MenuItem("关于",new EventHandler(About)));
        cm.MenuItems.Add(
    new System.Windows.Forms.MenuItem("退出",new EventHandler(Exit)));
        ni.ContextMenu
    =cm;
        ni.Visible
    =true;
        SetUpTimer();
        System.Windows.Forms.Application.Run();     
       }
       
    catch(System.Exception ex)
       {
        System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
       }
      }

      
    private static void StopService(object sender,System.EventArgs e)
      {
       
    if(sc.Status==System.ServiceProcess.ServiceControllerStatus.Running&&sc.CanStop==true)
       {
        
    try
        {
         sc.Stop();
        }
        
    catch(System.Exception ex)
        {
         System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
        }
       }
      }

      
    private static void PauseService(object sender,System.EventArgs e)
      {
       
    if(sc.Status!=System.ServiceProcess.ServiceControllerStatus.Paused&&sc.CanPauseAndContinue==true)
       {
        
    try
        {
         sc.Pause();
        }
        
    catch(System.Exception ex)
        {
         System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
        }
       }
      }

      
    private static void ContiuneService(object sender,System.EventArgs e)
      {
       
    if(sc.Status==System.ServiceProcess.ServiceControllerStatus.Paused&&sc.CanPauseAndContinue==true)
       {
        
    try
        {
         sc.Continue();
        }
        
    catch(System.Exception ex)
        {
         System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
        }
       }
      }

      
    private static void StartService(object sender,System.EventArgs e)
      {
       
    if(sc.Status==System.ServiceProcess.ServiceControllerStatus.Stopped)
       {
        
    try
        {
         sc.Start();
        }
        
    catch(System.Exception ex)
        {
         System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
        }
       }
      }

      
    private static void About(object sender,System.EventArgs e)
      {
                System.Windows.Forms.MessageBox.Show(
    "2005.4.3","关于");
      }

      
    private static void Exit(object sender,System.EventArgs e)
      {
       
    try
       {
        timer.Dispose();
        sc.Dispose();
        cm.Dispose();
        ni.Dispose();
        System.Windows.Forms.Application.Exit();
       }
       
    catch(System.Exception ex)
       {
        System.Windows.Forms.MessageBox.Show(ex.Message.ToString());
       }
      }

      
    private static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
      {
       GetServiceState();
      }

      
    private static void GetServiceState()
      {
       sc.Refresh();
       
    switch(sc.Status)
       {
        
    case System.ServiceProcess.ServiceControllerStatus.Stopped:
         {
         ni.Icon
    =new System.Drawing.Icon("stopped.ico");
         cm.MenuItems[
    0].Enabled=false;
         cm.MenuItems[
    1].Enabled=false;
         cm.MenuItems[
    2].Enabled=false;
         cm.MenuItems[
    3].Enabled=true;
         
    break;
        }
        
    case System.ServiceProcess.ServiceControllerStatus.Running:
        {
         ni.Icon
    =new System.Drawing.Icon("started.ico");
         cm.MenuItems[
    0].Enabled=true;
         cm.MenuItems[
    1].Enabled=true;
         cm.MenuItems[
    2].Enabled=false;
         cm.MenuItems[
    3].Enabled=false;
         
    break;
        }
        
    case System.ServiceProcess.ServiceControllerStatus.Paused:
        {
         ni.Icon
    =new System.Drawing.Icon("paused.ico");
         cm.MenuItems[
    0].Enabled=false;
         cm.MenuItems[
    1].Enabled=false;
         cm.MenuItems[
    2].Enabled=true;
         cm.MenuItems[
    3].Enabled=false;
         
    break;
        }
        
    default:
        {
         ni.Icon
    =new System.Drawing.Icon("paused.ico");
         
    break;
        }
       }
      }

      
    private static void SetUpTimer()
      {
       timer
    =new System.Timers.Timer();
       timer.Interval
    =500;
       timer.Elapsed 
    += new System.Timers.ElapsedEventHandler(timer_Elapsed);
       timer.Start();
      }
     }
    }

      但是有人评论说“这种方式决不是MS推荐的方式。本应该来自异步状态通知的钩子架构改成了定时器...写了十多年程序,最不齿的就是定时器,从来不用(javascript例外)。并不是仅仅因为定时器额外消耗资源,而且定时器逻辑隐藏着某种不合理性。

  • 相关阅读:
    autoresizing代码实现
    控制器的view的加载优先级
    iOS控制器的创建方式
    关于深复制和浅复制
    关于textField
    h5页面列表滚动加载数据
    数据库中存储过程和函数的区别
    Docker搭建Portainer可视化界面
    Docker部署springboot,从简单Eureka开始
    docker安装rabbitmq
  • 原文地址:https://www.cnblogs.com/76674718/p/1643368.html
Copyright © 2020-2023  润新知