知识大全 从Window系统托盘控制Windows服务

Posted

篇首语:心态决定成功的方向,勤奋是推动学习的基石。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 从Window系统托盘控制Windows服务相关的知识,希望对你有一定的参考价值。

从Window系统托盘控制Windows服务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

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

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

Imports System<fp class=\'fp-ax2rz\'></fp>Text Imports System<fp class=\'fp-e4fvj\'></fp>Diagnostics Imports System<fp class=\'fp-e4fvj\'></fp>ServiceProcess Public Module modMain Private WithEvents mobNotifyIcon As NotifyIcon Private WithEvents mobContextMenu As ContextMenu Private WithEvents mobTimer As Timers<fp class=\'fp-fsvyp\'></fp>Timer Private mobServiceController As ServiceController End Module

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

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

  

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

Private Sub SetUpTimer() Try mobTimer = New Timers<fp class=\'fp-e4fvj\'></fp>Timer() With mobTimer <fp class=\'fp-ax2rz\'></fp>AutoReset = True <fp class=\'fp-fsvyp\'></fp>Interval = <fp class=\'fp-r5vde\'></fp><fp class=\'fp-z7ief\'></fp><fp class=\'fp-z7ief\'></fp><fp class=\'fp-d9zwb\'></fp> <fp class=\'fp-5qsob\'></fp>Start() End With Catch obEx As Exception Throw obEx End Try End Sub

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

Private Sub CreateMenu() Try mobContextMenu<fp class=\'fp-ax2rz\'></fp>MenuItems<fp class=\'fp-e4fvj\'></fp>Add(New MenuItem(<fp class=\'fp-rt4bw\'></fp>停止<fp class=\'fp-rt4bw\'></fp><fp class=\'fp-9eeua\'></fp>New EventHandler(AddressOf StopService))) mobContextMenu<fp class=\'fp-5qsob\'></fp>MenuItems<fp class=\'fp-fsvyp\'></fp>Add(New MenuItem(<fp class=\'fp-rt4bw\'></fp>暂停<fp class=\'fp-323hg\'></fp><fp class=\'fp-te2\'></fp>New EventHandler(AddressOf PauseService))) mobContextMenu<fp class=\'fp-e4fvj\'></fp>MenuItems<fp class=\'fp-5qsob\'></fp>Add(New MenuItem(<fp class=\'fp-exfzh\'></fp>继续<fp class=\'fp-sob6f\'></fp><fp class=\'fp-a2uwg\'></fp>New EventHandler(AddressOf ContinueService))) mobContextMenu<fp class=\'fp-fsvyp\'></fp>MenuItems<fp class=\'fp-ax2rz\'></fp>Add(New MenuItem(<fp class=\'fp-sob6f\'></fp>开始<fp class=\'fp-323hg\'></fp><fp class=\'fp-te2\'></fp>New EventHandler(AddressOf StartService))) mobContextMenu<fp class=\'fp-ax2rz\'></fp>MenuItems<fp class=\'fp-5qsob\'></fp>Add(<fp class=\'fp-rt4bw\'></fp><fp class=\'fp-naabd\'></fp><fp class=\'fp-sob6f\'></fp>) mobContextMenu<fp class=\'fp-ax2rz\'></fp>MenuItems<fp class=\'fp-fsvyp\'></fp>Add(New MenuItem(<fp class=\'fp-exfzh\'></fp>关于<fp class=\'fp-rt4bw\'></fp><fp class=\'fp-mmu87\'></fp>New EventHandler(AddressOf AboutBox))) mobContextMenu<fp class=\'fp-ax2rz\'></fp>MenuItems<fp class=\'fp-ax2rz\'></fp>Add(New MenuItem(<fp class=\'fp-rt4bw\'></fp>退出<fp class=\'fp-323hg\'></fp><fp class=\'fp-a2uwg\'></fp>New EventHandler(AddressOf ExitController))) Catch obEx As Exception Throw obEx End Try End Sub

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

Private Sub GetServiceStatus() Try <fp class=\'fp-yj1b9\'></fp>//读取状态之前先进行刷新 mobServiceController<fp class=\'fp-ax2rz\'></fp>Refresh() <fp class=\'fp-pty82\'></fp>//变更菜单项和图标 Select Case mobServiceController<fp class=\'fp-5qsob\'></fp>Status() Case ServiceProcess<fp class=\'fp-5qsob\'></fp>ServiceControllerStatus<fp class=\'fp-fsvyp\'></fp>Paused mobNotifyIcon<fp class=\'fp-5qsob\'></fp>Icon = New Icon(<fp class=\'fp-sob6f\'></fp>Paused<fp class=\'fp-5qsob\'></fp>ico<fp class=\'fp-rt4bw\'></fp>) mobContextMenu<fp class=\'fp-ax2rz\'></fp>MenuItems(<fp class=\'fp-clqyu\'></fp>)<fp class=\'fp-e4fvj\'></fp>Enabled = False mobContextMenu<fp class=\'fp-ax2rz\'></fp>MenuItems(<fp class=\'fp-qhfb8\'></fp>)<fp class=\'fp-fsvyp\'></fp>Enabled = False mobContextMenu<fp class=\'fp-ax2rz\'></fp>MenuItems(<fp class=\'fp-zo2mf\'></fp>)<fp class=\'fp-fsvyp\'></fp>Enabled = True mobContextMenu<fp class=\'fp-fsvyp\'></fp>MenuItems(<fp class=\'fp-474rm\'></fp>)<fp class=\'fp-e4fvj\'></fp>Enabled = False Case ServiceProcess<fp class=\'fp-e4fvj\'></fp>ServiceControllerStatus<fp class=\'fp-ax2rz\'></fp>Running mobNotifyIcon<fp class=\'fp-e4fvj\'></fp>Icon = New Icon(<fp class=\'fp-sob6f\'></fp>Running<fp class=\'fp-5qsob\'></fp>ico<fp class=\'fp-exfzh\'></fp>) mobContextMenu<fp class=\'fp-5qsob\'></fp>MenuItems(<fp class=\'fp-z7ief\'></fp>)<fp class=\'fp-ax2rz\'></fp>Enabled = True mobContextMenu<fp class=\'fp-ax2rz\'></fp>MenuItems(<fp class=\'fp-qhfb8\'></fp>)<fp class=\'fp-e4fvj\'></fp>Enabled = True mobContextMenu<fp class=\'fp-fsvyp\'></fp>MenuItems(<fp class=\'fp-9ldqc\'></fp>)<fp class=\'fp-ax2rz\'></fp>Enabled = False mobContextMenu<fp class=\'fp-5qsob\'></fp>MenuItems(<fp class=\'fp-474rm\'></fp>)<fp class=\'fp-fsvyp\'></fp>Enabled = False Case ServiceProcess<fp class=\'fp-e4fvj\'></fp>ServiceControllerStatus<fp class=\'fp-fsvyp\'></fp>Stopped mobNotifyIcon<fp class=\'fp-e4fvj\'></fp>Icon = New Icon(<fp class=\'fp-323hg\'></fp>Stopped<fp class=\'fp-ax2rz\'></fp>ico<fp class=\'fp-exfzh\'></fp>) mobContextMenu<fp class=\'fp-5qsob\'></fp>MenuItems(<fp class=\'fp-z7ief\'></fp>)<fp class=\'fp-fsvyp\'></fp>Enabled = False mobContextMenu<fp class=\'fp-fsvyp\'></fp>MenuItems(<fp class=\'fp-qhfb8\'></fp>)<fp class=\'fp-e4fvj\'></fp>Enabled = False mobContextMenu<fp class=\'fp-ax2rz\'></fp>MenuItems(<fp class=\'fp-u51g8\'></fp>)<fp class=\'fp-ax2rz\'></fp>Enabled = False mobContextMenu<fp class=\'fp-fsvyp\'></fp>MenuItems(<fp class=\'fp-flw1n\'></fp>)<fp class=\'fp-e4fvj\'></fp>Enabled = True Case _ ServiceProcess<fp class=\'fp-fsvyp\'></fp>ServiceControllerStatus<fp class=\'fp-fsvyp\'></fp>ContinuePending<fp class=\'fp-a2uwg\'></fp> _ ServiceProcess<fp class=\'fp-5qsob\'></fp>ServiceControllerStatus<fp class=\'fp-5qsob\'></fp>PausePending<fp class=\'fp-9eeua\'></fp> _ ServiceProcess<fp class=\'fp-5qsob\'></fp>ServiceControllerStatus<fp class=\'fp-e4fvj\'></fp>StartPending<fp class=\'fp-te2\'></fp> _ ServiceProcess<fp class=\'fp-e4fvj\'></fp>ServiceControllerStatus<fp class=\'fp-fsvyp\'></fp>StopPending mobNotifyIcon<fp class=\'fp-ax2rz\'></fp>Icon = New Icon(<fp class=\'fp-323hg\'></fp>Paused<fp class=\'fp-e4fvj\'></fp>ico<fp class=\'fp-sob6f\'></fp>) mobContextMenu<fp class=\'fp-e4fvj\'></fp>MenuItems(<fp class=\'fp-kax3v\'></fp>)<fp class=\'fp-ax2rz\'></fp>Enabled = False mobContextMenu<fp class=\'fp-e4fvj\'></fp>MenuItems(<fp class=\'fp-blaph\'></fp>)<fp class=\'fp-e4fvj\'></fp>Enabled = False mobContextMenu<fp class=\'fp-fsvyp\'></fp>MenuItems(<fp class=\'fp-zo2mf\'></fp>)<fp class=\'fp-ax2rz\'></fp>Enabled = False mobContextMenu<fp class=\'fp-fsvyp\'></fp>MenuItems(<fp class=\'fp-474rm\'></fp>)<fp class=\'fp-ax2rz\'></fp>Enabled = False End Select <fp class=\'fp-yj1b9\'></fp>//检查<fp class=\'fp-dx7ut\'></fp>暂停<fp class=\'fp-2qegt\'></fp>和<fp class=\'fp-ouq3e\'></fp>继续<fp class=\'fp-jgh4o\'></fp>使用可用 If mobServiceController<fp class=\'fp-5qsob\'></fp>CanPauseAndContinue = False Then mobContextMenu<fp class=\'fp-5qsob\'></fp>MenuItems(<fp class=\'fp-42bl5\'></fp>)<fp class=\'fp-ax2rz\'></fp>Enabled = False mobContextMenu<fp class=\'fp-5qsob\'></fp>MenuItems(<fp class=\'fp-zo2mf\'></fp>)<fp class=\'fp-ax2rz\'></fp>Enabled = False End If Catch obEx As Exception Throw obEx End Try End Sub

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

<fp class=\'fp-k4x6u\'></fp>//停止服务的过程 Private Sub StopService(ByVal sender As Object<fp class=\'fp-mmu87\'></fp> ByVal e As EventArgs) Try If mobServiceController<fp class=\'fp-ax2rz\'></fp>Status = ServiceProcess<fp class=\'fp-5qsob\'></fp>ServiceControllerStatus<fp class=\'fp-fsvyp\'></fp>Running Then If mobServiceController<fp class=\'fp-fsvyp\'></fp>CanStop = True Then mobServiceController<fp class=\'fp-5qsob\'></fp>Stop() End If End If Catch obEx As Exception Throw obEx End Try End Sub <fp class=\'fp-yj1b9\'></fp>//暂停服务的过程 Private Sub PauseService(ByVal sender As Object<fp class=\'fp-a2uwg\'></fp> ByVal e As EventArgs) Try If Not mobServiceController<fp class=\'fp-ax2rz\'></fp>Status = ServiceProcess<fp class=\'fp-ax2rz\'></fp>ServiceControllerStatus<fp class=\'fp-ax2rz\'></fp>Paused = True Then If mobServiceController<fp class=\'fp-ax2rz\'></fp>CanPauseAndContinue = True Then mobServiceController<fp class=\'fp-e4fvj\'></fp>Pause() End If End If Catch obEx As Exception Throw obEx End Try End Sub <fp class=\'fp-pty82\'></fp>//继续服务程序的过程 Private Sub ContinueService(ByVal sender As Object<fp class=\'fp-mmu87\'></fp> ByVal e As EventArgs) Try If mobServiceController<fp class=\'fp-e4fvj\'></fp>Status = ServiceProcess<fp class=\'fp-ax2rz\'></fp>ServiceControllerStatus<fp class=\'fp-ax2rz\'></fp>Paused = True Then If mobServiceController<fp class=\'fp-e4fvj\'></fp>CanPauseAndContinue = True Then mobServiceController<fp class=\'fp-e4fvj\'></fp>Continue() End If End If Catch obEx As Exception Throw obEx End Try End Sub <fp class=\'fp-ks64c\'></fp>//开始服务程序的过程 Private Sub StartService(ByVal sender As Object<fp class=\'fp-a2uwg\'></fp> ByVal e As EventArgs) Try If mobServiceController<fp class=\'fp-fsvyp\'></fp>Status = ServiceProcess<fp class=\'fp-e4fvj\'></fp>ServiceControllerStatus<fp class=\'fp-ax2rz\'></fp>Stopped Then mobServiceController<fp class=\'fp-fsvyp\'></fp>Start() End If Catch obEx As Exception Throw obEx End Try End Sub <fp class=\'fp-pty82\'></fp>//<fp class=\'fp-07qj4\'></fp>关于<fp class=\'fp-jgh4o\'></fp>菜单项的过程 Private Sub AboutBox(ByVal sender As Object<fp class=\'fp-te2\'></fp> ByVal e As EventArgs) Try Dim obStringBuilder As New StringBuilder() With obStringBuilder <fp class=\'fp-5qsob\'></fp>Append(<fp class=\'fp-rt4bw\'></fp>Service Controller 使用例子<fp class=\'fp-sob6f\'></fp>) <fp class=\'fp-ax2rz\'></fp>Append(vbCrLf) <fp class=\'fp-fsvyp\'></fp>Append(<fp class=\'fp-rt4bw\'></fp>CLR 版本<fp class=\'fp-f94z5\'></fp><fp class=\'fp-rt4bw\'></fp>) <fp class=\'fp-fsvyp\'></fp>Append(Environment<fp class=\'fp-ax2rz\'></fp>Version<fp class=\'fp-ax2rz\'></fp>ToString) MsgBox(<fp class=\'fp-ax2rz\'></fp>ToString<fp class=\'fp-9eeua\'></fp> MsgBoxStyle<fp class=\'fp-ax2rz\'></fp>Information) End With obStringBuilder = Nothing Catch obEx As Exception Throw obEx End Try End Sub <fp class=\'fp-pty82\'></fp>//退出服务程序的过程 Private Sub ExitController(ByVal sender As Object<fp class=\'fp-te2\'></fp> ByVal e As EventArgs) Try mobTimer<fp class=\'fp-ax2rz\'></fp>Stop() mobTimer<fp class=\'fp-5qsob\'></fp>Dispose() mobNotifyIcon<fp class=\'fp-5qsob\'></fp>Visible = False mobNotifyIcon<fp class=\'fp-fsvyp\'></fp>Dispose() mobServiceController<fp class=\'fp-ax2rz\'></fp>Dispose() Application<fp class=\'fp-5qsob\'></fp>Exit() Catch obEx As Exception Throw obEx End Try End Sub <fp class=\'fp-yj1b9\'></fp>//定时器停止 Public Sub mobTimer_Elapsed(ByVal sender As Object<fp class=\'fp-9eeua\'></fp> ByVal e As System<fp class=\'fp-fsvyp\'></fp>Timers<fp class=\'fp-e4fvj\'></fp>ElapsedEventArgs) _ Handles mobTimer<fp class=\'fp-5qsob\'></fp>Elapsed Try GetServiceStatus() Catch obEx As Exception Throw obEx End Try End Sub <fp class=\'fp-k4x6u\'></fp>//系统托盘图标单击事件 Public Sub mobNotifyIcon_Click(ByVal sender As Object<fp class=\'fp-9eeua\'></fp> ByVal e As System<fp class=\'fp-ax2rz\'></fp>EventArgs) _ Handles mobNotifyIcon<fp class=\'fp-5qsob\'></fp>Click System<fp class=\'fp-fsvyp\'></fp>Diagnostics<fp class=\'fp-e4fvj\'></fp>Process<fp class=\'fp-5qsob\'></fp>Start(<fp class=\'fp-rt4bw\'></fp>IExplore<fp class=\'fp-5qsob\'></fp>exe<fp class=\'fp-323hg\'></fp><fp class=\'fp-mmu87\'></fp> <fp class=\'fp-323hg\'></fp><fp class=\'fp-exfzh\'></fp>) End Sub

  下面就是主程序

Public Sub Main() Try <fp class=\'fp-yj1b9\'></fp>//建立与服务程序的连接 mobServiceController = New System<fp class=\'fp-fsvyp\'></fp>ServiceProcess<fp class=\'fp-e4fvj\'></fp>ServiceController(<fp class=\'fp-rt4bw\'></fp>IISAdmin<fp class=\'fp-exfzh\'></fp>) <fp class=\'fp-k4x6u\'></fp>//隐藏图标<fp class=\'fp-n6918\'></fp>知道菜单项和图标准备好以后<fp class=\'fp-vopex\'></fp> mobNotifyIcon = New NotifyIcon() mobNotifyIcon<fp class=\'fp-fsvyp\'></fp>Visible = False mobContextMenu = New ContextMenu() CreateMenu() mobNotifyIcon<fp class=\'fp-5qsob\'></fp>ContextMenu = mobContextMenu mobNotifyIcon<fp class=\'fp-5qsob\'></fp>Text = <fp class=\'fp-323hg\'></fp>【孟宪会之精彩世界】<fp class=\'fp-323hg\'></fp> + _ Microsoft<fp class=\'fp-fsvyp\'></fp>VisualBasic<fp class=\'fp-ax2rz\'></fp>ChrW(<fp class=\'fp-blaph\'></fp><fp class=\'fp-d9zwb\'></fp>) + <fp class=\'fp-rt4bw\'></fp><fp class=\'fp-rt4bw\'></fp> SetUpTimer() mobNotifyIcon<fp class=\'fp-ax2rz\'></fp>Visible = True Application<fp class=\'fp-fsvyp\'></fp>Run() Catch obEx As Exception MsgBox(obEx<fp class=\'fp-5qsob\'></fp>Message<fp class=\'fp-5qsob\'></fp>ToString<fp class=\'fp-te2\'></fp> MsgBoxStyle<fp class=\'fp-fsvyp\'></fp>Critical) End End Try End Sub

  运行结果如下

cha138/Article/program/net/201311/11472

相关参考

知识大全 在Windows系统下管理Oracle9i服务

在Windows系统下管理Oracle9i服务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在

知识大全 windows优化系统后oracle9i本地连接失败

  我们使用的系统是windows经过优化后oracle数据库出现了问题本地客户端不能连接但远程连接是没有问题的    经过检查原来是oracle的TNSListener服务没有起动用服务起动或者ne

知识大全 C#下实现动态系统托盘图标

C#下实现动态系统托盘图标  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一概述  我这里所指的

知识大全 联想b475a怎么安装系统啊,windows7。我是电脑小白,详细点谢谢

联想b475a怎么安装系统啊,windows7。我是电脑小白,详细点谢谢尊敬的联想用户您好!关于您的问题,建议您联系售前进行咨询,或送至当地服务站进行安装系统。经销商和服务站链接:appserver.

知识大全 win8系统下如何设置时间和日期自动同步

win8系统下如何设置时间和日期自动同步Windows7点击开始菜单,在搜索框中输入:服务,回城,打开服务管理器Windows8/8.1按F3,在搜索框中输入:服务,回城,打开服务管理器找到名称为:W

知识大全 安卓机能不能刷成window的系统

安卓机能不能刷成window的系统能刷的几率很小,几乎没有。你说安卓是暴殄天物也不对,安卓的应用量仅次于ios,有好几十万,wp的应用只有几万,而且目前水平偏低。现在安卓四核手机只有用三星cpu和nv

知识大全 Windows 中不规则窗体的编程实现

Windows中不规则窗体的编程实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Window

知识大全 Oracle在基于Window操作系统的性能监控

Oracle在基于Window操作系统的性能监控  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Windows服务:方便地启动Oracle服务

Windows服务:方便地启动Oracle服务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  O

知识大全 C#创建Windows服务

C#创建Windows服务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &