2014-02-12 23 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/) –

相关问题