using System;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Collections;
using System.Configuration;
namespace ServiceClient
{
///
/// 概要描述
///
public partial class ServiceClient : Form
{
#region 变量
///
/// 当前打开日志路径
///
private string strCurrentPath = "";
///
/// 监听日志委托
///
///
public delegate void ListenNoteDelegate(string strMessage);
public ListenNoteDelegate addMessage;
///
/// 读取日志文件的线程
///
Thread readThread = null;
///获取服务地址
string ServerPath = string.Empty;
///获取服务代码
string ServerCode = string.Empty;
///获取服务名称
string ServerName = string.Empty;
#endregion
#region 构造函数
///
/// 构造函数
///
public ServiceClient()
{
InitializeComponent();
}
#endregion
#region 自定义函数
#region 判断window服务是否启动
///
/// 判断Windows服务是否启动
///
///
private bool IsServiceStart()
{
////定义返回值
bool bStartStatus = false;
try
{
////判断是否服务启动状态
if (Windows.IsRunning(ServerCode))
{
bStartStatus = true;
}
////根据是否开启服务设置按钮权限
if (bStartStatus)
{
this.btnOpenService.Enabled = false;
this.btnStopService.Enabled = true;
}
else
{
this.btnOpenService.Enabled = true;
this.btnStopService.Enabled = false;
}
////返回服务状态
return bStartStatus;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
#endregion
#region 加载服务
///
/// 加载服务
///
private void LoadServerData()
{
try
{
DataTable dt = new DataTable();
dt.Columns.Add("ServiceCode", typeof(string));
dt.Columns.Add("ServiceName", typeof(string));
dt.Columns.Add("ServiceState", typeof(string));
dt.Columns.Add("ServicePath", typeof(string));
#region 加载基础服务
ServiceSection serviceSection=ServiceSection.GetConfig();
foreach (TheKeyValue item in serviceSection.KeyValues)
{
DataRow tbsRow = dt.NewRow();
tbsRow["ServiceCode"] = item.Name;
tbsRow["ServiceName"] =item.Text;
tbsRow["ServicePath"] = Application.StartupPath + item.Path;
if (Windows.isServiceIsExisted(item.Name))
{
////判断是否服务启动状态
if (Windows.IsRunning(item.Name))
{
tbsRow["ServiceState"] = "服务正在运行";
}
else
{
tbsRow["ServiceState"] = "服务已停止";
}
}
else
{
tbsRow["ServiceState"] = "服务已卸载";
}
dt.Rows.Add(tbsRow);
}
//绑定数据
ServiceList.DataSource = dt;
#endregion
#region 格式化一下行颜色
for (int i = 0; i < ServiceList.RowCount; i++)
{
switch (ServiceList.Rows[i].Cells["ServiceState"].Value.ToString())
{
case "服务正在运行":
ServiceList.Rows[i].DefaultCellStyle.BackColor = btnOpenService.BackColor;
break;
case "服务已停止":
case "服务已卸载":
ServiceList.Rows[i].DefaultCellStyle.BackColor = btnUninstall.BackColor;
break;
default:
break;
}
}
#endregion
}
catch (Exception)
{
throw;
}
}
#endregion
#endregion
#region 自定义事件
#region 初始化事件
///
/// 初始化事件
///
///
///
private void FrmTCVMCClient_Load(object sender, EventArgs e)
{
LoadServerData();
////初始化任务栏图标
string icon = Directory.GetCurrentDirectory() + "\\Service.ico";
this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
notifyIcon1.Icon = new Icon(icon);//指定一个图标
notifyIcon1.Visible = false;
//notifyIcon1.MouseMove += notifyIcon1_MouseMove;
notifyIcon1.Click += new System.EventHandler(this.notifyIcon1_Click);
addMessage = new ListenNoteDelegate(ListenNote);
}
#endregion
#region 开启服务
///
/// 开启服务
///
///
///
private void btnOpenService_Click(object sender, EventArgs e)
{
try
{
if (MessageBox.Show("确定要开启"+ ServerName + "服务?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
{
if (Windows.StarmyService(ServerCode))//启动服务
{
if (Windows.IsRunning(ServerCode))//检查服务是否在运行
{
////把日志文件展示在列表中
MessageBox.Show("开启" + ServerName + "成功!");
this.Invoke(addMessage, "开启" + ServerName + "成功!");
//更改服务状态
ServiceList.CurrentRow.Cells["ServiceState"].Value = "服务正在运行";
//设置一下按钮权限
ServiceList_Click(null, null);
return;
}
else
{
////把日志文件展示在列表中
MessageBox.Show("开启" + ServerName + "成功!");
this.Invoke(addMessage, "开启" + ServerName + "成功!");
//设置一下按钮权限
IsServiceStart();
return;
}
}
}
}
catch (Exception ex)
{
////把日志文件展示在列表中
MessageBox.Show("开启" + ServerName + "异常:" + ex.Message);
this.Invoke(addMessage, "开启" + ServerName + "异常:" + ex.Message);
}
}
#endregion
#region 关闭服务
///
/// 关闭服务
///
///
///
private void btnStopService_Click(object sender, EventArgs e)
{
try
{
if (MessageBox.Show("确定关闭"+ ServerName + "服务?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
{
if (Windows.StopService(ServerCode))
{
if (Windows.IsRunning(ServerCode))//检查服务是否运行
{
MessageBox.Show("关闭" + ServerName + "失败!");
////把日志文件展示在列表中
this.Invoke(addMessage, "关闭" + ServerName + "失败!");
return;
}
else
{
////把日志文件展示在列表中
MessageBox.Show("关闭" + ServerName + "成功!");
this.Invoke(addMessage, "关闭" + ServerName + "成功!");
//更改服务状态
ServiceList.CurrentRow.Cells["ServiceState"].Value = "服务已停止";
//设置一下按钮权限
ServiceList_Click(null, null);
return;
}
}
}
}
catch (Exception ex)
{
////把日志文件展示在列表中
MessageBox.Show("关闭" + ServerName + "异常:" + ex.Message);
this.Invoke(addMessage, "关闭" + ServerName + "异常:" + ex.Message);
}
}
#endregion
#region 浏览日志
///
/// 浏览日志
///
///
///
private void btnViewLog_Click(object sender, EventArgs e)
{
////打开一个文件
OpenFileDialog OFD = new OpenFileDialog();
////设定打开的文件类型
OFD.Filter = "日志文件(*.log)|*.log|文本文件(*.txt)|*.txt";
////确定打开时
if (OFD.ShowDialog(this) == DialogResult.OK)
{
if (readThread != null)
{
////释放线程
readThread.Abort();
}
////清空显示内容
this.lbRealTimeNote.Items.Clear();
////给当前打开文件路径赋值
strCurrentPath = OFD.FileName;
////读取日志文件
readThread = new Thread(new ThreadStart(StreamReaderLogData));
////开启线程
readThread.Start();
}
}
#endregion
#region 读取日志文件
///
/// 读取日志文件
///
private void StreamReaderLogData()
{
using (FileStream fs = new FileStream(strCurrentPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
////读取打开的日志文件
using (StreamReader sr = new StreamReader(fs, Encoding.Default))
{
////逐行读取
while (!sr.EndOfStream)
{
////把日志文件展示在列表中
this.Invoke(addMessage, sr.ReadLine());
}
}
}
////释放线程
readThread.Abort();
}
#endregion
#region 监听日志
///
/// 监听日志
///
///
public void ListenNote(string strMessage)
{
this.lbRealTimeNote.Items.Add(DateTime.Now + ":" + strMessage);
////让滚动条显示在最下面
this.lbRealTimeNote.SelectedIndex = lbRealTimeNote.Items.Count - 1;
}
#endregion
#region 最小化隐藏在任务栏中
///
/// 最小化隐藏在任务栏中
///
///
///
private void FrmTCVMCClient_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide(); //或者是this.Visible = false;
this.notifyIcon1.Visible = true;
}
}
#endregion
#region 单击隐藏咋任务栏中的如表显示窗体
///
/// 单击隐藏咋任务栏中的如表显示窗体
///
///
///
private void notifyIcon1_Click(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Normal)
{
this.WindowState = FormWindowState.Minimized;
this.Hide();
}
else if (this.WindowState == FormWindowState.Minimized)
{
this.Show();
this.WindowState = FormWindowState.Normal;
this.Activate();
}
}
#endregion
#region 气泡提示
///
/// 气泡提示
///
///
///
private void notifyIcon1_MouseMove(object sender, MouseEventArgs e)
{
notifyIcon1.BalloonTipText = "服务管理";
notifyIcon1.ShowBalloonTip(5000);//显示气泡提示,参数为显示时间
}
#endregion
#region 安装服务
///
/// 安装服务
///
///
///
private void btnInstall_Click(object sender, EventArgs e)
{
try
{
if (MessageBox.Show("确定要安装"+ ServerName + "服务么?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
{
IDictionary dictionary = new Hashtable();
if (Windows.InstallmyService(dictionary, ServerPath))//安装服务
{
////把日志文件展示在列表中
MessageBox.Show("安装" + ServerName + "成功,未启动!");
this.Invoke(addMessage, "安装" + ServerName + "成功,未启动!");
//更改服务状态
ServiceList.CurrentRow.Cells["ServiceState"].Value = "服务已停止";
//设置一下按钮权限
ServiceList_Click(null, null);
}
else
{
////把日志文件展示在列表中
MessageBox.Show(ServerName+"服务已经存在");
this.Invoke(addMessage,ServerName+"服务已经存在!");
}
}
}
catch (Exception ex)
{
////把日志文件展示在列表中
MessageBox.Show(ServerName+"服务安装异常:" + ex.Message);
this.Invoke(addMessage,ServerName + "服务安装异常:" + ex.Message);
}
}
#endregion
#region 卸载服务
///
/// 卸载服务
///
///
///
private void btnUninstall_Click(object sender, EventArgs e)
{
try
{
if (MessageBox.Show("确定要卸载"+ ServerName + "服务么?", "询问", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
{
IDictionary dictionary = new Hashtable();
if (Windows.UnInstallmyService(dictionary, ServerPath))//卸载服务
{
if (!Windows.isServiceIsExisted(ServerCode))//检查服务是否存在
{
////把日志文件展示在列表中
MessageBox.Show("卸载" + ServerName + "成功!");
this.Invoke(addMessage, "卸载" + ServerName + "成功!");
//更改服务状态
ServiceList.CurrentRow.Cells["ServiceState"].Value = "服务已卸载";
//设置一下按钮权限
ServiceList_Click(null, null);
}
else
{
////把日志文件展示在列表中
MessageBox.Show("卸载" + ServerName + "失败!");
this.Invoke(addMessage, "卸载" + ServerName + "失败!");
}
}
else
{
////把日志文件展示在列表中
MessageBox.Show(ServerName + "已卸载!");
this.Invoke(addMessage, ServerName + "已卸载!");
}
}
}
catch (Exception ex)
{
////把日志文件展示在列表中
MessageBox.Show(ServerName + "服务卸载异常:" + ex.Message);
this.Invoke(addMessage, ServerName + "服务卸载异常:" + ex.Message);
}
}
#endregion
#region 列表变化时触发事件
///
/// 列表变化时触发事件
///
///
///
private void ServiceList_Click(object sender, EventArgs e)
{
try
{
if (ServiceList.CurrentRow == null) return;
switch (ServiceList.CurrentRow.Cells["ServiceState"].Value.ToString())
{
case "服务正在运行":
this.btnOpenService.Enabled = false;
this.btnStopService.Enabled = true;
this.btnInstall.Enabled = false;
this.btnUninstall.Enabled = false;
//ServiceList.CurrentRow.DefaultCellStyle.BackColor = btnOpenService.BackColor;
break;
case "服务已停止":
this.btnOpenService.Enabled = true;
this.btnStopService.Enabled = false;
this.btnInstall.Enabled = false;
this.btnUninstall.Enabled = true;
//ServiceList.CurrentRow.DefaultCellStyle.BackColor = btnUninstall.BackColor;
break;
case "服务已卸载":
this.btnOpenService.Enabled = false;
this.btnStopService.Enabled = false;
this.btnInstall.Enabled = true;
this.btnUninstall.Enabled = false;
//ServiceList.CurrentRow.DefaultCellStyle.BackColor = btnUninstall.BackColor;
break;
default:
this.btnOpenService.Enabled = false;
this.btnStopService.Enabled = false;
this.btnInstall.Enabled = false;
this.btnUninstall.Enabled = false;
//ServiceList.CurrentRow.DefaultCellStyle.BackColor = btnUninstall.BackColor;
break;
}
//取得服务代码
ServerCode = ServiceList.CurrentRow.Cells["ServiceCode"].Value.ToString();
ServerPath = ServiceList.CurrentRow.Cells["ServicePath"].Value.ToString();
ServerName = ServiceList.CurrentRow.Cells["ServiceName"].Value.ToString();
}
catch (Exception)
{
throw;
}
}
#endregion
#endregion
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
if (MessageBox.Show("真的要退出程序吗?", "退出程序", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
{
e.Cancel = true;
}
}
}
}