首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在启动exe时进行监视

在启动exe时进行监视
EN

Stack Overflow用户
提问于 2009-06-09 00:22:57
回答 5查看 13.2K关注 0票数 23

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

我无法访问可执行文件的代码来实现此功能,因此理想情况下,我希望编写一个C# .Net Windows服务,该服务将在可执行文件启动时进行监控。

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

也许我没有用正确的关键词进行搜索,但我还没有在谷歌或stackoverflow.com上找到任何非常有帮助的东西。

该解决方案需要在XP、Vista和Win7上运行...

提前感谢您的指点。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-09 00:32:51

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

代码语言:javascript
复制
 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

票数 39
EN

Stack Overflow用户

发布于 2009-06-09 00:30:06

这里有3个选项:

可靠/侵入式的是,在非托管代码中设置一个钩子,每当应用程序启动时,它就会与您的C#应用程序通信。这很难正确执行,并且需要为每个进程加载一个额外的DLL。(或者,您可以设置一个驱动程序,这会更难编写)

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

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

票数 5
EN

Stack Overflow用户

发布于 2009-06-09 00:35:01

监视进程是否正在运行-必须有一个服务正在运行才能做到这一点。

如果你真的不想消耗任何资源--用普通的C编写一个简单的服务。没有MFC/ATL的服务应用程序可以消耗低至300-400kb的内存,实际上没有CPU周期。当您感兴趣的进程启动时,您可以生成您的C#服务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/967646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档