Вы можете периодически опрашивать список запущенных процессов с использованием System.Diagnostics.Process.GetProcesses()
.
Этот следующий код выводит информацию о запуске и выходе процессов. Выход из системных процессов не будет распознаваться.
class Program
{
struct ProcessStartTimePair
{
public Process Process { get; set; }
public DateTime StartTime { get; set; }
public DateTime ExitTime
{
get
{
return DateTime.Now; // approximate value
}
}
public ProcessStartTimePair(Process p) : this()
{
Process = p;
try
{
StartTime = p.StartTime;
}
catch (System.ComponentModel.Win32Exception)
{
StartTime = DateTime.Now; // approximate value
}
}
}
static void Main(string[] args)
{
List<ProcessStartTimePair> knownProcesses = new List<ProcessStartTimePair>();
while (true)
{
foreach (Process p in Process.GetProcesses())
{
if (!knownProcesses.Select(x => x.Process.Id).Contains(p.Id))
{
knownProcesses.Add(new ProcessStartTimePair(p));
Console.WriteLine("Detected new process: " + p.ProcessName);
}
}
for (int i = 0; i < knownProcesses.Count; i++)
{
ProcessStartTimePair pair = knownProcesses[i];
try
{
if (pair.Process.HasExited)
{
Console.WriteLine(pair.Process.ProcessName + " has exited (alive from {0} to {1}).", pair.StartTime.ToString(), pair.ExitTime.ToString());
knownProcesses.Remove(pair);
i--; // List was modified, 1 item less
// TODO: Store in the info in the database
}
}
catch (System.ComponentModel.Win32Exception)
{
// Would have to check whether the process still exists in Process.GetProcesses().
// The process probably is a system process.
}
}
Console.WriteLine();
System.Threading.Thread.Sleep(1000);
}
}
}
Возможно, вы можете просто проигнорировать системные процессы, которые не позволяют вам прочитать свойство HasExited.
Редактировать
Вот .net версии 2.0:
static void Main(string[] args)
{
List<ProcessStartTimePair> knownProcesses = new List<ProcessStartTimePair>();
while (true)
{
foreach (Process p in Process.GetProcesses())
{
if (!ProcessIsKnown(knownProcesses, p.Id))
{
knownProcesses.Add(new ProcessStartTimePair(p));
Console.WriteLine("Detected new process: " + p.ProcessName);
}
}
for (int i = 0; i < knownProcesses.Count; i++)
[...]
}
}
static bool ProcessIsKnown(List<ProcessStartTimePair> knownProcesses, int ID)
{
foreach (ProcessStartTimePair pstp in knownProcesses)
{
if (pstp.Process.Id == ID)
{
return true;
}
}
return false;
}
Обратите внимание, что код может быть улучшена, и только показывает концепцию.
Что происходит, когда процесс появляется? Вы должны опросить каждую минуту, чтобы получить разрешение в 1 минуту? –
Да, вам нужно будет каждую минуту вытаскивать за это. Я бы сохранил все существующие процессы в списке и проверить, есть ли новые или некоторые из них вышли. – weiqure
Да, я думаю, что как только приложение закроется, ExitTime не будет accisble (поскольку он не работает). Я хочу сказать, что пользователь 'jdoe' использовал excel в общей сложности 44 минуты в июле – Jason