2009-06-24 78 views
0

昨天我問了這個問題,得到了很好的迴應/代碼示例。唯一的問題是,我忘了提到我被迫使用.Net Framework 2.0並且不能使用List.Select(我假設linq命名空間)。有沒有人有一個很好的解決List.Select看到如下:如何跟蹤應用程序使用情況? (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

可能重複:// stackoverflow.com/questions/1034967/how-to-track-application-usage) – BartoszKP 2014-09-16 21:09:53

回答

0

我不確定Id的數據類型。我假設一個int,你的想法:

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

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

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

你只需要做讓自己的ID的列表的工作。

此外,編輯原始問題通常是一個更好的主意,並留下他人答案的意見。

0

試試這個:

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

或者,如果你正在使用Visual Studio 2005(2008年沒有),

if(!knownProcesses.Exists(delegate(ProcessStartTimePair x) { return x.Process.Id == p.Id; })) 
[如何跟蹤應用程序的使用?(HTTP的