2015-11-02 3 views
1

J'ai une application C# pour trouver les "commencer à travailler" et "finir de travailler" des événements pour un utilisateur. Le but est d'obtenir une liste avec des valeurs de date/heure, quand un PC était "up" et quand il est "down" à nouveau.Où puis-je trouver des informations sur Windows était en mode veille

Cela fonctionne pour la connexion/déconnexion et l'hibernation, mais pas pour le mode veille (save energy). Recherche avec eventvwr Je n'ai pas trouvé les événements corrects connectés à "entrer en veille" et "se réveiller à partir du mode veille".

Avec cela, je lis des fenêtres journaux d'événements:

public SortedDictionary<string, UserProfileEvent> ReadUserProfileEvents() { 
    string queryString = string.Format("*[System[TimeCreated[@SystemTime>='{0}' and @SystemTime<='{1}']]]", this.StartDate.ToString("s"), this.EndDate.ToString("s")); 
    var q = new EventLogQuery("Microsoft-Windows-User Profile Service/Operational", PathType.LogName, queryString); 
    var r = new EventLogReader(q); 

    var liste = new SortedDictionary<string, UserProfileEvent>(); 

    EventRecord e = r.ReadEvent(); 
    UserProfileEvent upe = null; 
    while (e != null) { 
     upe = new UserProfileEvent(e); 
     try { 
      liste.Add(upe.SortKey, upe); 
     } 
     catch (Exception exp) { 
      throw new Exception("Some error text", exp); 
     } 
     e = r.ReadEvent(); 
    } 
    return liste; 
} 

Toutes les idées où trouver les événements corrects?

EDIT: Je viens de trouver "Microsoft-Windows-Power-Troubleshooter" et "Microsoft-Windows-Kernel-Power". Ces protocoles semblent pointer dans les bonnes directions ...

Répondre

2

Tout ne sera répertorié dans les journaux d'événements, car ils ne sont pas si important qu'une écriture dans un journal (sur le disque) serait nécessaire (par défaut).

Si votre application peut s'exécuter en arrière-plan, vous pouvez vous abonner à certains de ces événements et réagir en conséquence. Comme "C Sharper" a déjà écrit, vous pouvez les trouver dans le SystemEvents class.

  • sa mise en veille (Session ending - Se produit lorsque l'utilisateur tente de se déconnecter ou arrêter le système.)
  • utilisateur verrouille l'écran (Session switch - Se produit lorsque l'utilisateur actuellement connecté a changé)
1

S'il s'agit d'une application Windows Forms, vous pouvez utiliser la classe SystemEvents.

using System; 
using Microsoft.Win32; 

public sealed class App 
{ 
    static void Main() 
    {   
     // Set the SystemEvents class to receive event notification when a user 
     // preference changes, the palette changes, or when display settings change. 
     SystemEvents.SessionEnding+= SystemEvents_SessionEnding; 

     Console.WriteLine("This application is waiting for system events."); 
     Console.WriteLine("Press <Enter> to terminate this application."); 
     Console.ReadLine(); 
    } 

    // This method is called when a user preference changes. 
    static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) 
    { 
     e.Category); 
    } 

} 
+0

Mais je ne veux pas réagir sur un événement, je veux obtenir une liste de "commencer à être actif" et "finir d'être actif" pendant plusieurs semaines dans le passé. – Shnugo