有没有办法将事件处理程序附加到C#中正在运行的进程列表?

时间:2014-02-12 14:41:00

标签: c# windows events process

我目前正在编写一个对后台运行的程序敏感的winforms应用程序。目前我有一个线程检查每一秒如果我感兴趣的进程已经开始/仍在运行,但我确信如果我可以使用一个事件来告诉我用户何时打开会更容易/关闭了申请。请注意,我没有在程序中手动启动该过程;用户可以完全控制它。查看流程文档,我什么都看不到。有没有办法搞定这个?

2 个答案:

答案 0 :(得分:6)

您还可以使用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 以获取详细信息。

答案 1 :(得分:3)

嗯,至少应该可以在CreateProcess WinAPI方法上创建一个钩子。您甚至可以使用它来阻止进程启动(如果您不希望进程启动,只需返回false)。当然,你必须在每个可以启动新进程的方法上做一个钩子,但并不是那么多。

正如Purrformance建议的那样,http://easyhook.codeplex.com/是一个很容易从.NET创建钩子的库。

相关问题