检测应用程序的启动

13

如何使用C#在Windows上检测外部应用程序启动的时刻?

我尝试了FilesystemWatcher,但它不起作用,因为文件并没有真正改变。而且,不断检查所有打开的进程可能有点过度杀伤。还有其他方法可以做到这一点吗?如果不能用C#实现,那么是否可以用C++实现(如果可以,请给我一个例子)。

我想这样做是为了记录日志。

1个回答

22

你可以使用System.ManagementWMI(Windows管理 Instrumentation)


class WMIEvent {
    public static void Main() {
        WMIEvent we = new WMIEvent();
        ManagementEventWatcher w= null;
        WqlEventQuery q;
        try {
            q = new WqlEventQuery();
            q.EventClassName = "Win32_ProcessStartTrace";
            w = new ManagementEventWatcher(q);
            w.EventArrived += new EventArrivedEventHandler(we.ProcessStartEventArrived);
            w.Start();
            Console.ReadLine(); // block main thread for test purposes
        }
        finally {
            w.Stop();
        }
 }

    public void ProcessStartEventArrived(object sender, EventArrivedEventArgs e) {    
        foreach(PropertyData pd in e.NewEvent.Properties) {
            Console.WriteLine("\n============================= =========");
            Console.WriteLine("{0},{1},{2}",pd.Name, pd.Type, pd.Value);
        }
  }

@stalkerh 你是怎么做到的?像ManagementEventWatcher这样的各种类型,在System.Management或System.Mangement.Instrumentation中都不存在。我该去哪里找它们?是我的遗漏了什么吗? - Svish
算了,我还得添加对 System.Management dll 的引用。不仅仅是添加 using System.Management;叹气 :p - Svish
是的,我注意到了并且已经修复了,没有在这里发布。 - RC1140
我遇到了一个错误:“未处理的异常:System.Management.ManagementException:拒绝访问”。 - kirill2485
1
你需要以管理员身份运行它,否则会出现访问被拒绝的异常。 - FocusedWolf
值得一提的是,这仅适用于.NET Framework 4.7.2。 - Leo Gurdian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接