2009-06-24 15 views
0

J'ai posé cette question hier et j'ai obtenu un excellent exemple de réponse/code. Le seul problème est que j'ai oublié de mentionner que je suis obligé de travailler avec le .Net Framework 2.0 et que je ne peux pas utiliser List.Select (je suppose que l'espace de noms linq). Quelqu'un at-il un bon travail autour de List.Select vu ci-dessous:Comment suivre l'utilisation des applications? (2)

class Program 
{ 
    struct ProcessStartTimePair 
    { 
     public Process Process { get; set; } 
     public DateTime StartTime { get; set; } 
     public DateTime ExitTime 
     { 
      get 
      { 
       return DateTime.Now; // approximate value 
      } 
     } 
     public ProcessStartTimePair(Process p) : this() 
     { 
      Process = p; 
      try 
      { 
       StartTime = p.StartTime; 
      } 
      catch (System.ComponentModel.Win32Exception) 
      { 
       StartTime = DateTime.Now; // approximate value 
      } 
     } 
    } 
    static void Main(string[] args) 
    { 
     SqlConnection cnn = new SqlConnection(@"Data Source=XXXXXX;Initial Catalog=XXXXXX;User ID=XXXX;Password=XXXX"); 
     List<ProcessStartTimePair> knownProcesses = new List<ProcessStartTimePair>(); 
     while (true) 
     { 
      foreach (Process p in Process.GetProcesses()) 
      { 
       if (!knownProcesses.Select(x => x.Process.Id).Contains(p.Id)) 
       { 
        knownProcesses.Add(new ProcessStartTimePair(p)); 
        //Console.WriteLine("Detected new process: " + p.ProcessName); 
       } 
      } 
      for (int i = 0; i < knownProcesses.Count; i++) 
      { 
       ProcessStartTimePair pair = knownProcesses[i]; 
       try 
       { 
        if (pair.Process.HasExited) 
        { 
         Console.WriteLine(pair.Process.ProcessName + " has exited (alive from {0} to {1}).", pair.StartTime.ToString(), pair.ExitTime.ToString()); 
         knownProcesses.Remove(pair); 
         i--; // List was modified, 1 item less 
         // TODO: Store in the info in the database 
         String sql = "insert into procs (machine,login,process,start_time,end_time) "; 
         sql += "values ('" + Environment.MachineName + "','" + System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString().Split('\\')[1] + "','" + pair.Process.ProcessName + "','" + pair.StartTime.ToString() + "','" + pair.ExitTime.ToString() + "');"; 
         SqlCommand cmd = new SqlCommand(sql, cnn); 
         try 
         { 
          cnn.Open(); 
          cmd.ExecuteNonQuery(); 
         } 
         catch (Exception ex) 
         { 
          //Console.WriteLine(ex.Message); 
         } 
         finally 
         { 
          cnn.Close(); 
         } 
        } 
       } 
       catch (System.ComponentModel.Win32Exception) 
       { 
        // Would have to check whether the process still exists in Process.GetProcesses(). 
        // The process probably is a system process. 
       } 
      } 
      //Console.WriteLine(); 
      System.Threading.Thread.Sleep(5000); 
     } 
    } 
} 
+0

double possible de [Comment suivre l'utilisation des applications?] (Http: // stackoverflow.com/questions/1034967/how-to-track-application-usage) – BartoszKP

Répondre

0

Je ne suis pas sûr que le type de données Id. Je suppose un int, vous voyez l'idée:

List<int> idList = new List<int>(); 

foreach(ProcessStartTimePair proc in knownProcesses) 
{ 
    idList.Add(proc.Process.Id); 
} 

if(idList.Contains(p.Id)) 
{ 
    // ... 
} 

Il vous suffit de faire le travail d'obtenir la liste des ID vous-même.

De même, il est généralement préférable de modifier votre question initiale et de laisser des commentaires sur les réponses des autres.

0

Essayez ceci:

if(!knownProcesses.Exists(x => x.Process.Id == p.Id)) 

Ou, si vous utilisez Visual Studio 2005 (non 2008),

if(!knownProcesses.Exists(delegate(ProcessStartTimePair x) { return x.Process.Id == p.Id; }))