20 .net c# monitoring windows-services
我有一些应用程序需要运行的服务,以便一些应用程序的功能工作.我想启用该选项,仅在启动应用程序后启动外部Windows服务进行初始化.(而不是让它们自动启动机器并在不需要应用程序时占用内存)
我没有访问exe的代码来实现它,所以理想情况下我想写一个C#.Net Windows服务,它将监视exe何时启动.
到目前为止我发现的是System.IO.FileSystemEventHandler.此组件仅处理已更改,创建,删除和重命名的事件类型.我不希望文件系统组件是找到我正在寻找的东西的理想位置,但不知道还能去哪里.
也许我没有使用正确的关键字进行搜索,但我还没有在Google或stackoverflow.com上找到任何非常有用的内容.
当它到来时,解决方案将需要在XP,Vista和Win 7上运行...
提前感谢任何指针.
Mic*_*tta 34
在本文中,您可以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);
}
}
Run Code Online (Sandbox Code Playgroud)
WMI允许相当复杂的查询; 您可以在此处修改查询,以便仅在您观看的应用程序启动时或其他条件时触发您的事件处理程序. 从C#的角度来看,这是一个快速介绍.
您在这里有3个选择:
可靠/侵入性强,在非托管代码中设置钩子,每当启动应用程序时,该钩子便会与您的C#应用程序通信。这很难解决,涉及到每个进程都加载一个额外的DLL。(或者,您可以设置一个驱动程序,这更难编写)
不太可靠的方法是定期(例如每10到30秒)列出所有进程(使用System.Diagnostics.Process类),以查看该应用程序是否已启动。
也可能从托管代码观看Win32_Process,InstanceCreationEvent WMI事件。不确定这有多可靠,但是我怀疑这比轮询过程要好。
| 归档时间: |
|
| 查看次数: |
10611 次 |
| 最近记录: |