【问题标题】:How to detect a process start & end using c# in windows?如何在 Windows 中使用 c# 检测进程的开始和结束?
【发布时间】:2012-01-17 08:36:00
【问题描述】:

我对 C# 有很好的工作经验,但现在我想开发一个简单的(可能是控制台应用程序)软件,它只检测在我的计算机上启动或结束的进程的名称和时间。

例如(我假设我的小应用程序已经在运行)如果用户打开 Firefox,那么它应该随时间将 firefox.exe 插入数据库,如果用户关闭它,它也会这样做。

和上面一样,如果用户打开记​​事本,那么它应该插入notepad.exe和时间等等。

我知道如何在数据库中插入值,但我只需要您帮助确定进程/程序何时在我的系统上开始或结束。

老实说,我以前从未开发过这种应用程序,所以我不知道可以使用控制台应用程序,或者我需要制作一个 Windows 服务应用程序等。

所以请考虑我是初学者,提供您的答案。

在 C# 部分我能够理解它,所以需要担心。

我正在使用带有 .net 4.0 的 Visual Studio 2010。

【问题讨论】:

标签: c# windows c#-4.0 process


【解决方案1】:

要在不进行轮询的情况下执行此操作,需要 WMI。这在 .net 中得到很好的支持,您可以使用 ManagementEventWatcher 类订阅 WMI 通知。

Code Project article 说明了它是如何完成的。这是一个摘录,展示了它是多么简单。

notePad = new ProcessInfo("notepad.exe");
notePad.Started +=
    new Win32Process.ProcessInfo.StartedEventHandler(this.NotepadStarted);
notePad.Terminated +=
    new Win32Process.ProcessInfo.TerminatedEventHandler(this.NotepadTerminated);

请注意,ProcessInfo 是在该文章所附代码中实现的类。

【讨论】:

  • 有谁知道这种监视进程(即每 2 秒查询一次)实际上是多么昂贵?一旦应用程序启动,我将编写一个 Windows 服务来做一些事情,但不想减慢使用计算机的速度。
  • @Kevkong “每 2 秒查询一次”是什么意思?这听起来像投票。上面描述的不是轮询。
  • 如果您查看 ProcessInfo 的源代码,它确实看起来像是在轮询我,这就是我问的原因。甚至作者评论说:“//每 2 秒查询一次 string pol = “2”;”
  • @Anatolli 如果您找不到现有问题,则无法在评论中回答,请自行询问。
  • 刚刚尝试了链接。它还活着。 Kevkong 也是对的。它使用轮询。但它通过 WMI 检查进程的存在,而不是使用诸如 foreach 之类的代码(var p in Process.GetProcessesByName("foo") 循环遍历进程。也许这样消耗的资源更少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
相关资源
最近更新 更多