一、需求
windows程序,定时监测某软件是否启动状态,并通过redis发送监测数据。
二、开发前梳理
通过vs2019进行代码编写,使用隐藏的winform实现,定时任务通过.net自带的System.Timers工具,redis工具使用ServiceStack.Redis,任务主要通过System.Diagnostics
工具获取程序进程,并定时获取其状态,最后使用wix打包工具,将程序打包程MSI,以供客户机安装。安装后自启,并且程序需要可以实现开机自启,通过添加RegistryKey注册表实现。
三、实现
首先新建一个winform程序,向窗体中添加notifyicon和contextmenustrip,这两个控件的组合是实现将程序运行时图标显示在任务栏里。可以选中notifyicon1在右侧属性栏的Icon属性添加显示图标,也可以在代码中添加,后面又需求根据被检测软件运行状态而变换图标颜色的需求,所以在代码中会有所体现。
单击选中contextMenuStrip1,添加一个按钮“退出”,用来执行退出程序操作。
单击选中退出按钮,在右侧属性栏的事件属性列表中添加clicks事件
至此,简单的winform前端完成,接下来实现代码部分。
转到窗体的代码部分,
public partial class IconForm : Form
{
public IconForm()
{
InitializeComponent();
}
//log4n用于输出打印日志
ILog _log = LogManager.GetLogger(typeof(IconForm));
//服务程序的主体类
CheckService checkService = new CheckService();
//程序任务栏托管的显示图标
string iconY = ConfigurationManager.AppSettings["IconY"].Trim();
string iconN = ConfigurationManager.AppSettings["IconN"].Trim();
bool check = false;//开机自启标志
#region 窗体单例模式
//使用单例模式是为了在后续改变显示图标时不新建窗体,而是同一个窗体
public static IconForm instance;
public static IconForm CreateForm()
{
if (instance == null || instance.IsDisposed)
{
instance = new IconForm();
}
return instance;
}
#endregion
#region 载入
private void IconForm_Load(object sender, EventArgs e)
{
//检查是否开机自启
RegistryKey r_local = Registry.CurrentUser;
RegistryKey r_run = r_local.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false);
if (r_run.GetValue("CheckService") == null)
{
check = true;
}
r_run.Close();
r_local.Close();
CheckedChanged(check);
checkService.Start();
}
#endregion
#region 画面及控件隐藏
private void IconForm_SizeChanged(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide(); //或者是this.Visible = false;
this.notifyIcon1.Visible = true;
}
}
#endregion
#region 小图标右键退出按钮
private void exitMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("您确定要退出程序吗?", "确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
{
notifyIcon1.Visible = false;
checkService.Stop();
this.Close();
this.Dispose();
Applicati