在启动exe时监视

时间:2009-06-09 00:22:57

标签: c# .net windows-services monitoring

我有一些应用程序需要运行的服务,以便某些应用程序的功能正常运行。我想启用该选项,仅在启动应用程序后启动外部Windows服务进行初始化。 (而不是让它们自动启动机器并在不需要应用程序时占用内存)

我无法访问exe的代码来实现这一点,所以理想情况下我想编写一个C#.Net Windows服务来监控exe的启动时间。

到目前为止我发现的是System.IO.FileSystemEventHandler。此组件仅处理已更改,创建,删除和重命名的事件类型。我不希望文件系统组件是找到我正在寻找的东西的理想位置,但不知道还能去哪里。

也许我没有使用正确的关键字进行搜索,但我还没有在Google或者stackoverflow.com上找到任何非常有用的内容。

当它出现时,需要在XP,Vista和Win 7上运行解决方案......

提前感谢任何指示。

5 个答案:

答案 0 :(得分:33)

this article,您可以在服务中使用WMI(System.Management命名空间)来监视流程启动事件。

 void WaitForProcess()
{
    ManagementEventWatcher startWatch = new ManagementEventWatcher(
      new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
    startWatch.EventArrived
                        += new EventArrivedEventHandler(startWatch_EventArrived);
    startWatch.Start();

    ManagementEventWatcher stopWatch = new ManagementEventWatcher(
      new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace"));
    stopWatch.EventArrived
                        += new EventArrivedEventHandler(stopWatch_EventArrived);
    stopWatch.Start();
}

  static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e) {
    stopWatch.Stop();
    Console.WriteLine("Process stopped: {0}"
                      , e.NewEvent.Properties["ProcessName"].Value);
  }

  static void startWatch_EventArrived(object sender, EventArrivedEventArgs e) {
    startWatch.Stop();
    Console.WriteLine("Process started: {0}"
                      , e.NewEvent.Properties["ProcessName"].Value);
  }
}

WMI允许相当复杂的查询;您可以在此处修改查询,以便仅在您观看的应用程序启动时或其他条件时触发您的事件处理程序。从{C#角度来看Here's a quick introduction

答案 1 :(得分:5)

这里有3个选项:

可靠/侵入性的,在非托管代码中设置一个钩子,每当应用程序启动时,它都会与您的C#应用​​程序进行通信。这很难做到并且涉及为每个进程加载额外的DLL。 (或者你可以设置一个更难写的驱动程序)

不太可靠的方式,定期列出所有进程(使用System.Diagnostics.Process类)(比如说每10-30秒)以查看应用程序是否已启动。

也可以从托管代码中查看Win32_Process,InstanceCreationEvent WMI事件。不确定这是多么可靠,但我怀疑它会比投票过程更好。

答案 2 :(得分:0)

监视进程是否正在运行 - 但必须运行一个服务才能执行此操作。

如果你真的不想消耗任何资源 - 在普通的C中编写一个简单的服务。没有MFC / ATL写的服务应用程序可以消耗低至300-400 kb的内存,而且几乎没有CPU周期。当您感兴趣的过程开始时,您可以生成C#服务。

答案 3 :(得分:0)

 public Process IsProcessOpen(string name)
        {
            foreach (Process clsProcess in Process.GetProcesses())
                if (clsProcess.ProcessName.Contains(name))
                    return clsProcess;
            return null;
        }

答案 4 :(得分:0)

在回复Windows 7方面它不起作用。如果您正在监视64位进程,则需要构建进程以在64位地址空间中工作。