我想在C#中创建一个程序或服务,监视用户何时启动某个应用程序,如excel或access。使用System.Diagnostics.Process,我可以获得正在运行的进程,但我希望在用户启动应用程序时监视该事件。我们想创建一些使用历史。
答案 0 :(得分:4)
您可以使用WMI执行此操作:
private ManagementEventWatcher WatchForProcessStart(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceCreationEvent " +
"WITHIN 10 " +
" WHERE TargetInstance ISA 'Win32_Process' " +
" AND TargetInstance.Name = '" + processName + "'";
// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";
// Create a watcher and listen for events
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessStarted;
watcher.Start();
return watcher;
}
private void ProcessStarted(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
string processName = targetInstance.Properties["Name"].Value.ToString();
Console.WriteLine(String.Format("{0} process started", processName));
}
它会监视10个最新进程的数组,并在更改时调用事件
答案 1 :(得分:4)
我使用WqlEventQuery对象做了一个小例子来检查是否有进程的新实例。然后检查名称并按照您的意愿进行操作。如果您想改进我的查询 - 请随时查看相应的syntax description。
private static void lookForExcel()
{
WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance isa \"Win32_Process\"");
ManagementEventWatcher watcher = new ManagementEventWatcher(query);
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Start();
Console.ReadLine();
watcher.Stop();
}
static void watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
string instanceName = ((ManagementBaseObject)e.NewEvent["TargetInstance"])["Name"].ToString();
if (instanceName.ToLower()=="excel.exe")
{
Debug.WriteLine("Excel has been started ...");
}
}
答案 2 :(得分:0)
最简单的方法是定期检查正在运行的进程,并与之前的列表进行比较。
但是,您可以获得有关流程启动的通知。文档:
您还可以在安全事件日志中启用“详细跟踪”,然后将显示系统上启动和结束的每个进程。那可能太过分了。