2009-12-31 11 views
30

Có cách nào để xác định lần cuối cùng một máy cụ thể chạy lần cuối một quá trình không?Trình giám sát quy trình .NET

Tôi có thể sử dụng thông tin sau đây để xác định liệu một quy trình có đang chạy hay không, nhưng ứng dụng không thể lấy quy trình nếu quá trình đó đã dừng.

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

Trả lời

57

WMI cung cấp cách theo dõi quá trình bắt đầu và kết thúc bằng các lớp Win32_ProcessTrace. Tốt nhất được hiển thị với một ví dụ. Bắt đầu một ứng dụng Console mới, Project + Add Reference, chọn System.Management. Dán mã này:

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 để chương trình này chạy cao. Sau đó, chỉ cần bắt đầu một số chương trình để xem nó tại nơi làm việc. Cẩn thận rằng nó không phải là đặc biệt nhanh chóng.

+1

Cảm ơn bạn. Chỉ cần thử nó và nó hoạt động hoàn hảo. –

+1

Nó hoạt động hoàn hảo, nhưng sự chậm trễ là gây phiền nhiễu, có anyway để có được nó nhanh hơn? –

+0

Tôi vừa thử nó và có độ trễ ít hơn 1 giây. Tôi nghĩ rằng điều này là ok. – webber2k6

5

Bạn sẽ không thể thực hiện việc này bằng cách sử dụng lớp Process. Tuy nhiên, có thể tìm ra khi một ứng dụng được chạy lần cuối bằng cách cấu hình theo dõi quá trình kiểm toán trong Windows. Các liên kết sau đây có thể giúp bạn bắt đầu:

Audit process tracking

How can I track what programs come and go on my machine?

Các theo dõi quá trình sẽ tạo mục trong bản ghi sự kiện của Windows mà bạn có thể truy cập bằng C#.