我有一些应用程序需要运行的服务,以使应用程序的一些功能正常工作。我想启用该选项,以便在应用程序启动后仅启动外部Windows服务进行初始化。(而不是让它们自动启动机器并在不需要应用程序时占用内存)
我无法访问可执行文件的代码来实现此功能,因此理想情况下,我希望编写一个C# .Net Windows服务,该服务将在可执行文件启动时进行监控。
到目前为止,我找到的是System.IO.FileSystemEventHandler。此组件仅处理更改、创建、删除和重命名的事件类型。我不认为文件系统组件会是找到我正在寻找的东西的理想位置,但我不知道还能去哪里。
也许我没有用正确的关键词进行搜索,但我还没有在谷歌或stackoverflow.com上找到任何非常有帮助的东西。
该解决方案需要在XP、Vista和Win7上运行...
提前感谢您的指点。
发布于 2009-06-09 00:32:51
在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。
发布于 2009-06-09 00:30:06
这里有3个选项:
可靠/侵入式的是,在非托管代码中设置一个钩子,每当应用程序启动时,它就会与您的C#应用程序通信。这很难正确执行,并且需要为每个进程加载一个额外的DLL。(或者,您可以设置一个驱动程序,这会更难编写)
不太可靠的方法是,定期(比如每10-30秒)列出所有进程(使用System.Diagnostics.Process类),以查看应用程序是否启动。
也可以从托管代码中查看Win32_Process、InstanceCreationEvent WMI事件。我不确定这有多可靠,但我怀疑它会比轮询过程更好。
发布于 2009-06-09 00:35:01
监视进程是否正在运行-必须有一个服务正在运行才能做到这一点。
如果你真的不想消耗任何资源--用普通的C编写一个简单的服务。没有MFC/ATL的服务应用程序可以消耗低至300-400kb的内存,实际上没有CPU周期。当您感兴趣的进程启动时,您可以生成您的C#服务。
https://stackoverflow.com/questions/967646
复制相似问题