如下图为托盘控制一个服务
实现步奏
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里输入服务名称就可以了