监视一个exe是否启动

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (34)

我有一些应用程序需要运行的服务才能使应用程序的某些功能发挥作用。我想启用该选项只启动外部Windows服务在应用程序启动后进行初始化。(而不是让它们在机器上自动启动并在不需要应用程序时占用内存)

我没有访问exe的代码来实现这一点,所以理想情况下我想编写一个C#.Net Windows服务来监视exe是否启动。

我到目前为止发现的是System.IO.FileSystemEventHandler。此组件仅处理更改,创建,删除和重命名的事件类型。我不希望文件系统组件是找到我要找的东西的理想场所,但不知道还有什么地方可以去。

提问于
用户回答回答于

可以System.Management在服务中使用WMI(名称空间)来监视进程启动事件。

 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#应用​​程序进行通信。这很难得到正确的结果,并且需要在每个进程中加载​​一个额外的DLL。(或者你可以设置一个驱动程序,这更难写)

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

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

扫码关注云+社区

领取腾讯云代金券