2010-01-27 3 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» не может быть найдено (вы пропали без вести с помощью директивы или ссылка на сборку?)

Спасибо,

Томек

ответ

6

Вам нужно пространство имен System.Management, которое включено в образец кода, предоставленный вами. Я считаю, что вам нужно ссылаться на библиотеку System.Management в настройках вашего проекта. Выполните следующие шаги для этого (я предполагаю, что вы подаете в суд на Visual Studio):

Перейдите в Обозреватель решений и разверните проект, щелкните правой кнопкой мыши по папке/Панели ссылок и выберите Добавить ссылки из контекстного меню. Теперь выберите вкладку .Net и выберите «System.Management» из списка и нажмите «ОК».

+0

спасибо за совет, теперь я получаю сообщение об ошибке, что WqlEventQuery "не содержит конструктор, который принимает аргументы" 1 ". Я искал в Интернете какое-то решение, и кажется, что люди используют WqlEventQuery, передавая один аргумент. Я собираюсь сделать еще несколько исследований. – Tomek

+0

Вероятно, вы получаете эту ошибку из-за следующей строки кода: public class WqlEventQuery: EventQuery {} Эта строка в основном переопределяет класс WqlEventQuery. И поскольку у вас нет конструкторов, определенных для этого класса, будет использоваться конструктор по умолчанию. – user258808