2010-01-27 8 views
8

Estoy tratando de utilizar ManagementEventWatcher en un servicio para realizar un seguimiento de cuándo una computadora entra y sale del modo de suspensión. Soy nuevo en .NET y C#, así que estoy luchando un poco para llegar a la sintaxis para que esto funcione.¿Cómo se usa ManagementEventWatcher para realizar un seguimiento de suspender/reanudar?

He encontrado un blog post que detalla cómo usó ManagementEventWatcher para realizar un seguimiento de este estado, pero no publicó todo su código. Estoy tratando de realizar un servicio simple que crea un archivo de registro .txt que indica que la computadora se ha suspendido/reanudado, pero tengo problemas con los espacios de nombres y los tipos.

Aquí está el código para el archivo 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() 
     { 
     } 

    } 
} 

Una vez más, esta es la primera vez que estoy de programación con .NET y C# así que pido disculpas por mi ignorancia.

estoy recibiendo errores de espacio de nombres, tales como:

El tipo o espacio de nombres 'ManagementEventWatcher' no podría ser encontrado (¿falta una Directiva usando o una referencia de ensamblado?)

Gracias,

Tomek

Respuesta

6

Necesita el espacio de nombres System.Management, que se incluye en el ejemplo de código proporcionado por usted. Creo que necesita hacer referencia a la biblioteca System.Management en la configuración de su proyecto. Siga los siguientes pasos para hacer esto (supongo que está demandando a Visual Studio):

Vaya al Explorador de soluciones y expanda su proyecto, haga clic derecho en la carpeta/opción Referencias y seleccione Agregar referencias en el menú contextual. Ahora seleccione la pestaña .Net y seleccione System.Management de la lista y haga clic en OK.

+0

gracias por el consejo, ahora recibo un error que WqlEventQuery "no contiene un constructor que toma '1' argumentos". He estado buscando en línea alguna solución y parece que la gente ha estado usando WqlEventQuery pasando un solo argumento. Voy a tener que investigar un poco más. – Tomek

+0

Probablemente esté obteniendo ese error debido a la siguiente línea de código: clase pública WqlEventQuery: EventQuery {} esa línea básicamente redefine la clase WqlEventQuery. Y dado que no tiene ningún constructor definido para esta clase, se usará el constructor predeterminado. – user258808

Cuestiones relacionadas