從Window系統托盤控制Windows服務

來源:互聯網
上載者:User
從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<br />Imports System.Diagnostics<br />Imports System.ServiceProcess</p><p>Public Module modMain</p><p> Private WithEvents mobNotifyIcon As NotifyIcon<br /> Private WithEvents mobContextMenu As ContextMenu<br /> Private WithEvents mobTimer As Timers.Timer<br /> Private mobServiceController As ServiceController</p><p>End Module<br />

上面的代碼首先引用了三個名稱空間,然後分別定義了四個變數:mobNotifyIcon將會在系統托盤裡顯示;ContextMenu顯示菜單資訊;mobTimer為定時器,原來檢查服務的狀態,以隨時變更菜單和表徵圖的狀態;mobServiceController表示Windows服務應用程式並允許串連到正在運行或者已停止的服務、對其進行操作或擷取有關它的資訊。

由於服務程式是沒有使用者介面的,因此我們設定三種表徵圖識別服務的狀態,這裡做了三個簡單的表徵圖來識別服務的狀態:Running.ico,Paused.ico,Stopped.ico,分別如下:

下面我們就建立定時器SetUpTimer過程,通常,IIS停止或啟動的間隔為5秒,我們就用5秒來做定時器的間隔,代碼如下:

Private Sub SetUpTimer()<br />Try<br />mobTimer = New Timers.Timer()<br />With mobTimer<br />.AutoReset = True<br />.Interval = 5000<br />.Start()<br />End With<br />Catch obEx As Exception<br />Throw obEx<br />End Try<br />End Sub<br />

下面,建立操作功能表的過程,並為每個功能表項目添加事件處理常式:

Private Sub CreateMenu()<br />Try<br />mobContextMenu.MenuItems.Add(New MenuItem("停止",New EventHandler(AddressOf StopService)))<br />mobContextMenu.MenuItems.Add(New MenuItem("暫停",New EventHandler(AddressOf PauseService)))<br />mobContextMenu.MenuItems.Add(New MenuItem("繼續",New EventHandler(AddressOf ContinueService)))<br />mobContextMenu.MenuItems.Add(New MenuItem("開始",New EventHandler(AddressOf StartService)))<br />mobContextMenu.MenuItems.Add("-")<br />mobContextMenu.MenuItems.Add(New MenuItem("關於",New EventHandler(AddressOf AboutBox)))<br />mobContextMenu.MenuItems.Add(New MenuItem("退出",New EventHandler(AddressOf ExitController)))<br />Catch obEx As Exception<br />Throw obEx<br />End Try<br />End Sub<br />

當我們改變了服務的運行狀態時,我們應當向使用者反映這一變化,這裡用托盤的表徵圖不同來進行標識。當服務程式啟動時,就要先建立服務的狀態,首先GetServiceStatus程序呼叫ServiceController的Refresh方法,它將會重新整理的ServiceController所有屬性。要準確得到服務程式的狀態,這一過程是至關重要的,下面的Select Case語句根據不同的服務程式的狀態,建立不同的功能表項目和托盤表徵圖。

Private Sub GetServiceStatus()<br />Try<br /> '//讀取狀態之前先進行重新整理<br /> mobServiceController.Refresh()<br /> '//變更功能表項目和表徵圖<br /> Select Case mobServiceController.Status()<br /> Case ServiceProcess.ServiceControllerStatus.Paused<br /> mobNotifyIcon.Icon = New Icon("Paused.ico")<br /> mobContextMenu.MenuItems(0).Enabled = False<br /> mobContextMenu.MenuItems(1).Enabled = False<br /> mobContextMenu.MenuItems(2).Enabled = True<br /> mobContextMenu.MenuItems(3).Enabled = False<br /> Case ServiceProcess.ServiceControllerStatus.Running<br /> mobNotifyIcon.Icon = New Icon("Running.ico")<br /> mobContextMenu.MenuItems(0).Enabled = True<br /> mobContextMenu.MenuItems(1).Enabled = True<br /> mobContextMenu.MenuItems(2).Enabled = False<br /> mobContextMenu.MenuItems(3).Enabled = False<br /> Case ServiceProcess.ServiceControllerStatus.Stopped<br /> mobNotifyIcon.Icon = New Icon("Stopped.ico")<br /> mobContextMenu.MenuItems(0).Enabled = False<br /> mobContextMenu.MenuItems(1).Enabled = False<br /> mobContextMenu.MenuItems(2).Enabled = False<br /> mobContextMenu.MenuItems(3).Enabled = True<br /> Case _<br /> ServiceProcess.ServiceControllerStatus.ContinuePending, _<br /> ServiceProcess.ServiceControllerStatus.PausePending, _<br /> ServiceProcess.ServiceControllerStatus.StartPending, _<br /> ServiceProcess.ServiceControllerStatus.StopPending<br /> mobNotifyIcon.Icon = New Icon("Paused.ico")<br /> mobContextMenu.MenuItems(0).Enabled = False<br /> mobContextMenu.MenuItems(1).Enabled = False<br /> mobContextMenu.MenuItems(2).Enabled = False<br /> mobContextMenu.MenuItems(3).Enabled = False<br /> End Select<br /> '//檢查“暫停”和“繼續”使用可用<br /> If mobServiceController.CanPauseAndContinue = False Then<br /> mobContextMenu.MenuItems(1).Enabled = False<br /> mobContextMenu.MenuItems(2).Enabled = False<br /> End If</p><p>Catch obEx As Exception<br />Throw obEx<br />End Try<br />End Sub<br />

下面建立功能表項目的事件處理常式:

'//停止服務的過程<br />Private Sub StopService(ByVal sender As Object, ByVal e As EventArgs)<br />Try<br />If mobServiceController.Status = ServiceProcess.ServiceControllerStatus.Running Then<br />If mobServiceController.CanStop = True Then<br />mobServiceController.Stop()<br />End If<br />End If<br />Catch obEx As Exception<br />Throw obEx<br />End Try<br />End Sub</p><p>'//暫停服務的過程<br />Private Sub PauseService(ByVal sender As Object, ByVal e As EventArgs)<br />Try<br />If Not mobServiceController.Status = ServiceProcess.ServiceControllerStatus.Paused = True Then<br />If mobServiceController.CanPauseAndContinue = True Then<br />mobServiceController.Pause()<br />End If<br />End If<br />Catch obEx As Exception<br />Throw obEx<br />End Try<br />End Sub</p><p>'//繼續服務程式的過程<br />Private Sub ContinueService(ByVal sender As Object, ByVal e As EventArgs)<br />Try<br />If mobServiceController.Status = ServiceProcess.ServiceControllerStatus.Paused = True Then<br />If mobServiceController.CanPauseAndContinue = True Then<br />mobServiceController.Continue()<br />End If<br />End If<br />Catch obEx As Exception<br />Throw obEx<br />End Try<br />End Sub</p><p>'//開始服務程式的過程<br />Private Sub StartService(ByVal sender As Object, ByVal e As EventArgs)<br />Try<br />If mobServiceController.Status = ServiceProcess.ServiceControllerStatus.Stopped Then<br />mobServiceController.Start()<br />End If<br />Catch obEx As Exception<br />Throw obEx<br />End Try<br />End Sub</p><p>'//“關於”功能表項目的過程<br />Private Sub AboutBox(ByVal sender As Object, ByVal e As EventArgs)<br />Try<br />Dim obStringBuilder As New StringBuilder()<br />With obStringBuilder<br />.Append("Service Controller 使用例子")<br />.Append(vbCrLf)<br />.Append("CLR 版本:")<br />.Append(Environment.Version.ToString)<br />MsgBox(.ToString, MsgBoxStyle.Information)<br />End With<br />obStringBuilder = Nothing<br />Catch obEx As Exception<br />Throw obEx<br />End Try<br />End Sub</p><p>'//退出服務程式的過程<br />Private Sub ExitController(ByVal sender As Object, ByVal e As EventArgs)<br />Try<br />mobTimer.Stop()<br />mobTimer.Dispose()<br />mobNotifyIcon.Visible = False<br />mobNotifyIcon.Dispose()<br />mobServiceController.Dispose()<br />Application.Exit()<br />Catch obEx As Exception<br />Throw obEx<br />End Try<br />End Sub</p><p>'//定時器停止<br />Public Sub mobTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) _<br />Handles mobTimer.Elapsed<br />Try<br />GetServiceStatus()<br />Catch obEx As Exception<br />Throw obEx<br />End Try<br />End Sub</p><p>'//系統托盤表徵圖單擊事件<br />Public Sub mobNotifyIcon_Click(ByVal sender As Object, ByVal e As System.EventArgs) _<br />Handles mobNotifyIcon.Click<br />System.Diagnostics.Process.Start("IExplore.exe", "http://xml.sz.luohuedu.net/")<br />End Sub<br />

下面就是主程式:

Public Sub Main()<br />Try<br />'//建立與服務程式的串連<br />mobServiceController = New System.ServiceProcess.ServiceController("IISAdmin")<br />'//隱藏表徵圖,知道功能表項目和表徵圖準備好以後。<br />mobNotifyIcon = New NotifyIcon()<br />mobNotifyIcon.Visible = False<br />mobContextMenu = New ContextMenu()<br />CreateMenu()<br />mobNotifyIcon.ContextMenu = mobContextMenu<br />mobNotifyIcon.Text = "【孟憲會之精彩世界】" + _<br />Microsoft.VisualBasic.ChrW(10) + "http://xml.sz.luohuedu.net/"<br />SetUpTimer()<br />mobNotifyIcon.Visible = True<br />Application.Run()<br />Catch obEx As Exception<br />MsgBox(obEx.Message.ToString, MsgBoxStyle.Critical)<br />End<br />End Try<br />End Sub<br />

運行結果如下:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.