2009-12-31 90 views
30

有没有一种方法可以确定特定机器最后一次运行进程的时间?.NET进程监视器

我可以使用以下内容来确定进程是否正在运行,但是如果进程已停止,应用程序无法获取进程。

Process[] process = Process.GetProcessesByName(processName, serverName); 

回答

57

WMI提供了一种跟踪启动和终止Win32_ProcessTrace类的进程的方法。最好用一个例子来展示。启动一个新的控制台应用程序,Project +添加引用,选择System.Management。粘贴此代码:

using System; 
using System.Management; 

class Process { 
    public static void Main() { 
    ManagementEventWatcher startWatch = new ManagementEventWatcher(
     new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace")); 
    startWatch.EventArrived += new EventArrivedEventHandler(startWatch_EventArrived); 
    startWatch.Start(); 
    ManagementEventWatcher stopWatch = new ManagementEventWatcher(
     new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace")); 
    stopWatch.EventArrived += new EventArrivedEventHandler(stopWatch_EventArrived); 
    stopWatch.Start(); 
    Console.WriteLine("Press any key to exit"); 
    while (!Console.KeyAvailable) System.Threading.Thread.Sleep(50); 
    startWatch.Stop(); 
    stopWatch.Stop(); 
    } 

    static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e) { 
    Console.WriteLine("Process stopped: {0}", e.NewEvent.Properties["ProcessName"].Value); 
    } 

    static void startWatch_EventArrived(object sender, EventArrivedEventArgs e) { 
    Console.WriteLine("Process started: {0}", e.NewEvent.Properties["ProcessName"].Value); 
    } 
} 

Edit the manifest所以这个程序运行升高。然后只需启动一些程序即可在工作中看到它。注意它不是特别快。

+1

谢谢。刚刚尝试过,它完美地工作。 – 2010-01-05 20:19:46

+1

它完美的工作,但延迟是烦人的,有反正它让它更快? – 2012-05-13 11:20:30

+0

我刚刚尝试过,延迟时间少于1秒。我认为这是好的。 – webber2k6 2012-11-16 07:29:52