2012-09-10 27 views
3

可能重複:
Track started applications in Windows如何監控,當用戶在C#中啓動Excel等Windows應用程序

我喜歡營造一種程序或C#服務,監視,當用戶推出一些像Excel或Access一樣的應用程序。使用System.Diagnostics.Process,我可以獲取正在運行的進程,但我想在用戶啓動應用程序時監視事件。我們想創建一些使用歷史記錄。

+0

到http://stackoverflow.com/questions/162444/track-started-applications-in-windows –

+0

http://stackoverflow.com/questions/848618/net-events-for-process-類似可執行啓動 –

回答

4

我使用WqlEventQuery對象來檢查是否有做了一個小例子調用事件過程的新實例。之後檢查名稱並按照你的意願去做。如果你想改善我的查詢 - 請隨時查看syntax description

private static void lookForExcel() 
{ 
    WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance isa \"Win32_Process\""); 
    ManagementEventWatcher watcher = new ManagementEventWatcher(query); 
    watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived); 
    watcher.Start(); 
    Console.ReadLine(); 
    watcher.Stop(); 
} 

static void watcher_EventArrived(object sender, EventArrivedEventArgs e) 
{ 
    string instanceName = ((ManagementBaseObject)e.NewEvent["TargetInstance"])["Name"].ToString(); 
    if (instanceName.ToLower()=="excel.exe") 
    { 
     Debug.WriteLine("Excel has been started ...");  
    }    
} 
4

可以使用WMI做到這一點:

private ManagementEventWatcher WatchForProcessStart(string processName) 
{ 
    string queryString = 
     "SELECT TargetInstance" + 
     " FROM __InstanceCreationEvent " + 
     "WITHIN 10 " + 
     " WHERE TargetInstance ISA 'Win32_Process' " + 
     " AND TargetInstance.Name = '" + processName + "'"; 

    // The dot in the scope means use the current machine 
    string scope = @"\\.\root\CIMV2"; 

    // Create a watcher and listen for events 
    ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString); 
    watcher.EventArrived += ProcessStarted; 
    watcher.Start(); 
    return watcher; 
} 

private void ProcessStarted(object sender, EventArrivedEventArgs e) 
{ 
    ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value; 
    string processName = targetInstance.Properties["Name"].Value.ToString(); 
    Console.WriteLine(String.Format("{0} process started", processName)); 
} 

這手錶10個最新工藝的陣列,當它改變

相關問題