2014-02-12 49 views
6

我目前正在編寫一個Winforms應用程序,它對在後臺運行的程序很敏感。目前我有一個線程每秒檢查一次,如果我感興趣的進程已經開始/仍在運行,但是我確信如果我可以使用一個事件告訴我用戶何時打開/關閉應用程序。請注意,我沒有在程序中手動啓動該過程;用戶有完全的控制權。通過流程文檔查看我什麼也沒看到。有沒有什麼辦法可以融入這個?有沒有辦法將事件處理程序附加到C#中正在運行的進程列表?

+0

你可能會發現這裏的答案也有用:http://stackoverflow.com/questions/1916141/can-i-get-notified-when-some-process-starts – Baldrick

+0

可能重複的[.NET進程監視器]( http://stackoverflow.com/questions/1986249/net-process-monitor) –

回答

4

您還可以使用WMI活動來跟蹤這一點。

下面是一個例子:

static void Main(string[] args) 
{ 
    var query = new EventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance isa \"Win32_Process\""); 

    using (var eventWatcher = new ManagementEventWatcher(query)) 
    { 
     eventWatcher.EventArrived += eventWatcher_EventArrived; 
     eventWatcher.Start(); 
     Console.WriteLine("Started"); 
     Console.ReadLine(); 
     eventWatcher.EventArrived -= eventWatcher_EventArrived; 
     eventWatcher.Stop(); 
    } 
} 

static void eventWatcher_EventArrived(object sender, EventArrivedEventArgs e) 
{ 
    try 
    { 
     var instanceDescription = e.NewEvent.GetPropertyValue("TargetInstance") as ManagementBaseObject; 
     if(instanceDescription!=null) 
     { 
      var executablePath = instanceDescription.GetPropertyValue("ExecutablePath"); 
      if(executablePath!=null) 
      { 
       Console.WriteLine("Application {0} started", executablePath.ToString()); 
      } 
     } 
    } 
    catch (ManagementException) { } 
} 

有很多過程的屬性可被接收的。如優先級,說明,命令行參數等。有關詳細信息,請參閱instanceDescription.Properties

+0

這非常方便,漂亮和乾淨。它不應該像我的解決方案那樣減緩新流程的開始(如果鉤子太慢)。 – Luaan

2

那麼,至少應該可以在WinAPI方法上創建鉤子。你甚至可以用它來阻止進程啓動(如果你不想讓進程啓動,只需返回false)。當然,你必須勾畫出每一種可以啓動一個新流程的方法,但並不是那麼多。

由於Purrformance建議,http://easyhook.codeplex.com/是從.NET輕鬆創建鉤子的好方法。

+2

我打算回答類似的問題,但既然你做了,那麼這裏有一個+1。此外,它遷徙是值得一提的[EasyHook](http://easyhook.codeplex.com/) –

相關問題