2009-06-24 3 views
0

Ich habe diese Frage gestern gestellt und ein tolles Antwort/Codebeispiel bekommen. Das einzige Problem ist, dass ich vergessen habe zu erwähnen, dass ich gezwungen bin, mit dem .Net Framework 2.0 zu arbeiten und die List.Select nicht benutzen kann (ich nehme den linq Namespace an). Hat jemand eine gute Arbeit für List.Select siehe unten:Wie verfolgen Sie die Anwendungsnutzung? (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

möglich Duplikat [Wie die Anwendungsnutzung verfolgen?] (Http: // stackoverflow.com/questions/1034967/how-to-track-application-usage) – BartoszKP

Antwort

0

Ich bin nicht sicher, der Datentyp von Id. Ich werde einen int annehmen, erhalten Sie die Idee:

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

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

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

Sie haben nur sich selbst die Arbeit bekommen die Liste der IDs zu tun.

Außerdem ist es im Allgemeinen eine bessere Idee, Ihre ursprüngliche Frage zu bearbeiten und Kommentare zu den Antworten anderer zu hinterlassen.

0

Versuchen Sie folgendes:

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

Oder, wenn Sie Visual Studio 2005 (nicht 2008) verwenden,

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