分享
 
 
 

从Window系统托盘控制Windows服务

王朝system·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

从Window系统托盘控制Windows服务

作者: 孟宪会 出自: 【孟宪会之精彩世界】 发布日期: 2003-8-5 17:38:11

从Window系统托盘控制Windows服务

VB.NET有许多内建的类,可以让我们轻松创建Windows服务程序,但如何轻松控制这些服务呢?一般是到管理工具里面进行控制。本文将描述如何创建一个运行在系统托盘里的程序来轻松控制一个服务程序。至于如何创建服务程序,可以参考.NET SDK或其它创建服务程序的文章,本文的例子利用IIS的W3SVC服务来做例子,来控制IIS的停止与启动。

要开发这样的程序,我们先打开Microsoft Visual Studio.NET,新建一个名为ServiceController的解决方案,然后新建名为WinForm的Visual Basic类型的Windows应用程序,然后把VS.NET自动创建的Form1.vb删除掉,因为我们创建的应用程序没有用户界面,我们在Sub Main运行程序。

先添加引用-.NET-System.ServiceProcess.dll,新建名为modMain的模块,代码如下:

Imports System.Text

Imports System.Diagnostics

Imports System.ServiceProcess

Public Module modMain

Private WithEvents mobNotifyIcon As NotifyIcon

Private WithEvents mobContextMenu As ContextMenu

Private WithEvents mobTimer As Timers.Timer

Private mobServiceController As ServiceController

End Module

上面的代码首先引用了三个名称空间,然后分别定义了四个变量:mobNotifyIcon将会在系统托盘里显示;ContextMenu显示菜单信息;mobTimer为定时器,原来检查服务的状态,以随时变更菜单和图标的状态;mobServiceController表示Windows服务应用程序并允许连接到正在运行或者已停止的服务、对其进行操作或获取有关它的信息。

由于服务程序是没有用户界面的,因此我们设置三种图标标识服务的状态,这里做了三个简单的图标来标识服务的状态:Running.ico,Paused.ico,Stopped.ico,分别如下:

下面我们就建立定时器SetUpTimer过程,通常,IIS停止或启动的间隔为5秒,我们就用5秒来做定时器的间隔,代码如下:

Private Sub SetUpTimer()

Try

mobTimer = New Timers.Timer()

With mobTimer

.AutoReset = True

.Interval = 5000

.Start()

End With

Catch obEx As Exception

Throw obEx

End Try

End Sub

下面,创建上下文菜单的过程,并为每个菜单项添加事件处理程序:

Private Sub CreateMenu()

Try

mobContextMenu.MenuItems.Add(New MenuItem("停止",New EventHandler(AddressOf StopService)))

mobContextMenu.MenuItems.Add(New MenuItem("暂停",New EventHandler(AddressOf PauseService)))

mobContextMenu.MenuItems.Add(New MenuItem("继续",New EventHandler(AddressOf ContinueService)))

mobContextMenu.MenuItems.Add(New MenuItem("开始",New EventHandler(AddressOf StartService)))

mobContextMenu.MenuItems.Add("-")

mobContextMenu.MenuItems.Add(New MenuItem("关于",New EventHandler(AddressOf AboutBox)))

mobContextMenu.MenuItems.Add(New MenuItem("退出",New EventHandler(AddressOf ExitController)))

Catch obEx As Exception

Throw obEx

End Try

End Sub

当我们改变了服务的运行状态时,我们应当向用户反映这一变化,这里用托盘的图标不同来进行标识。当服务程序启动时,就要先建立服务的状态,首先GetServiceStatus过程调用ServiceController的Refresh方法,它将会刷新的ServiceController所有属性。要准确得到服务程序的状态,这一过程是至关重要的,下面的Select Case语句根据不同的服务程序的状态,建立不同的菜单项和托盘图标。

Private Sub GetServiceStatus()

Try

'//读取状态之前先进行刷新

mobServiceController.Refresh()

'//变更菜单项和图标

Select Case mobServiceController.Status()

Case ServiceProcess.ServiceControllerStatus.Paused

mobNotifyIcon.Icon = New Icon("Paused.ico")

mobContextMenu.MenuItems(0).Enabled = False

mobContextMenu.MenuItems(1).Enabled = False

mobContextMenu.MenuItems(2).Enabled = True

mobContextMenu.MenuItems(3).Enabled = False

Case ServiceProcess.ServiceControllerStatus.Running

mobNotifyIcon.Icon = New Icon("Running.ico")

mobContextMenu.MenuItems(0).Enabled = True

mobContextMenu.MenuItems(1).Enabled = True

mobContextMenu.MenuItems(2).Enabled = False

mobContextMenu.MenuItems(3).Enabled = False

Case ServiceProcess.ServiceControllerStatus.Stopped

mobNotifyIcon.Icon = New Icon("Stopped.ico")

mobContextMenu.MenuItems(0).Enabled = False

mobContextMenu.MenuItems(1).Enabled = False

mobContextMenu.MenuItems(2).Enabled = False

mobContextMenu.MenuItems(3).Enabled = True

Case _

ServiceProcess.ServiceControllerStatus.ContinuePending, _

ServiceProcess.ServiceControllerStatus.PausePending, _

ServiceProcess.ServiceControllerStatus.StartPending, _

ServiceProcess.ServiceControllerStatus.StopPending

mobNotifyIcon.Icon = New Icon("Paused.ico")

mobContextMenu.MenuItems(0).Enabled = False

mobContextMenu.MenuItems(1).Enabled = False

mobContextMenu.MenuItems(2).Enabled = False

mobContextMenu.MenuItems(3).Enabled = False

End Select

'//检查“暂停”和“继续”使用可用

If mobServiceController.CanPauseAndContinue = False Then

mobContextMenu.MenuItems(1).Enabled = False

mobContextMenu.MenuItems(2).Enabled = False

End If

Catch obEx As Exception

Throw obEx

End Try

End Sub

下面建立菜单项的事件处理程序:

'//停止服务的过程

Private Sub StopService(ByVal sender As Object, ByVal e As EventArgs)

Try

If mobServiceController.Status = ServiceProcess.ServiceControllerStatus.Running Then

If mobServiceController.CanStop = True Then

mobServiceController.Stop()

End If

End If

Catch obEx As Exception

Throw obEx

End Try

End Sub

'//暂停服务的过程

Private Sub PauseService(ByVal sender As Object, ByVal e As EventArgs)

Try

If Not mobServiceController.Status = ServiceProcess.ServiceControllerStatus.Paused = True Then

If mobServiceController.CanPauseAndContinue = True Then

mobServiceController.Pause()

End If

End If

Catch obEx As Exception

Throw obEx

End Try

End Sub

'//继续服务程序的过程

Private Sub ContinueService(ByVal sender As Object, ByVal e As EventArgs)

Try

If mobServiceController.Status = ServiceProcess.ServiceControllerStatus.Paused = True Then

If mobServiceController.CanPauseAndContinue = True Then

mobServiceController.Continue()

End If

End If

Catch obEx As Exception

Throw obEx

End Try

End Sub

'//开始服务程序的过程

Private Sub StartService(ByVal sender As Object, ByVal e As EventArgs)

Try

If mobServiceController.Status = ServiceProcess.ServiceControllerStatus.Stopped Then

mobServiceController.Start()

End If

Catch obEx As Exception

Throw obEx

End Try

End Sub

'//“关于”菜单项的过程

Private Sub AboutBox(ByVal sender As Object, ByVal e As EventArgs)

Try

Dim obStringBuilder As New StringBuilder()

With obStringBuilder

.Append("Service Controller 使用例子")

.Append(vbCrLf)

.Append("CLR 版本:")

.Append(Environment.Version.ToString)

MsgBox(.ToString, MsgBoxStyle.Information)

End With

obStringBuilder = Nothing

Catch obEx As Exception

Throw obEx

End Try

End Sub

'//退出服务程序的过程

Private Sub ExitController(ByVal sender As Object, ByVal e As EventArgs)

Try

mobTimer.Stop()

mobTimer.Dispose()

mobNotifyIcon.Visible = False

mobNotifyIcon.Dispose()

mobServiceController.Dispose()

Application.Exit()

Catch obEx As Exception

Throw obEx

End Try

End Sub

'//定时器停止

Public Sub mobTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) _

Handles mobTimer.Elapsed

Try

GetServiceStatus()

Catch obEx As Exception

Throw obEx

End Try

End Sub

'//系统托盘图标单击事件

Public Sub mobNotifyIcon_Click(ByVal sender As Object, ByVal e As System.EventArgs) _

Handles mobNotifyIcon.Click

System.Diagnostics.Process.Start("IExplore.exe", "http://xml.sz.luohuedu.net/")

End Sub

下面就是主程序:

Public Sub Main()

Try

'//建立与服务程序的连接

mobServiceController = New System.ServiceProcess.ServiceController("IISAdmin")

'//隐藏图标,知道菜单项和图标准备好以后。

mobNotifyIcon = New NotifyIcon()

mobNotifyIcon.Visible = False

mobContextMenu = New ContextMenu()

CreateMenu()

mobNotifyIcon.ContextMenu = mobContextMenu

mobNotifyIcon.Text = "【孟宪会之精彩世界】" + _

Microsoft.VisualBasic.ChrW(10) + "http://xml.sz.luohuedu.net/"

SetUpTimer()

mobNotifyIcon.Visible = True

Application.Run()

Catch obEx As Exception

MsgBox(obEx.Message.ToString, MsgBoxStyle.Critical)

End

End Try

End Sub

运行结果如下:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有