2010-01-27 64 views
8

我試圖在服務中使用ManagementEventWatcher來跟蹤計算機何時進入和退出睡眠模式。我是.NET和C#的新手,所以我很努力地提出語法來完成這個工作。如何使用ManagementEventWatcher跟蹤暫停/恢復?

我發現一個blog post,詳細介紹了他如何使用ManagementEventWatcher跟蹤此狀態,但他沒有發佈他的整個代碼。我試圖通過並創建一個簡單的服務來創建一個.txt日誌文件,指出計算機已被暫停/恢復,但遇到名稱空間和類型問題。

下面是代碼的service.cs文件:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.Management; 

namespace SleepNotifierService 
{ 
    public class WqlEventQuery : EventQuery { } 

    public partial class Service1 : ServiceBase 
    { 
     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 


      WqlEventQuery query = new WqlEventQuery("Win32_PowerManagementEvent"); 
      _watcher = new ManagementEventWatcher(query); 
      _watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); 
      _watcher.Start(); 
     } 

     protected override void OnStop() 
     { 
      _watcher.Stop(); 
     } 

     void watcher_EventArrived(object sender, EventArrivedEventArgs e) 
     { 
      try 
      { 
       int eventType = Convert.ToInt32(e.NewEvent.Properties["EventType"].Value); 
       switch (eventType) 
       { 
        case 4: 
         Sleep(); 
         break; 
        case 7: 
         Resume(); 
         break; 
       } 
      } 
      catch (Exception ex) 
      { 
       //Log(ex.Message); 
      } 
     } 

     public void Sleep() 
     { 
     } 

     public void Resume() 
     { 
     } 

    } 
} 

再次,這是我與.NET和C#編程,所以我爲我的無知道歉的第一次。

我得到的命名空間的錯誤,如:

類型或命名空間名稱 「ManagementEventWatcher」不能 (是否缺少using 指令或程序集引用?)

謝謝,

託梅克

回答

6

您需要System.Management命名空間,它包含在您提供的代碼示例中。我相信你需要在你的項目設置中引用System.Management庫。按照下面的步驟來做到這一點(我假設你起訴Visual Studio):

轉到解決方案資源管理器,並展開您的項目,右鍵單擊References文件夾/選項並從上下文菜單中選擇添加引用。現在選擇.Net選項卡並從列表中選擇System.Management並單擊確定。

+0

感謝您的建議,現在我得到一個錯誤,WqlEventQuery「不包含帶'1'參數的構造函數」。我一直在尋找一些解決方案,似乎人們通過傳遞一個參數來使用WqlEventQuery。我將不得不做更多的研究。 – Tomek 2010-01-28 17:57:45

+0

由於以下代碼行可能導致該錯誤: public class WqlEventQuery:EventQuery {} 該行基本上重新定義了WqlEventQuery類。由於您沒有爲此類定義任何構造函數,因此將使用默認構造函數。 – user258808 2010-01-28 19:52:57