Лучший способ зарегистрировать время запуска процесса? - PullRequest
7 голосов
/ 15 января 2012

Я пишу программу, которая должна регистрировать время запуска процесса, например notepad . Я думал, что это хорошо, чтобы создать таймер, который проверяет все процессы каждую секунду. Но я думаю, что это замедлит работу компьютера пользователя. Есть ли лучший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 15 января 2012

Первоначально для всех запущенных процессов определяется время создания.Затем используйте WMI для регистрации событий создания процесса.

См. Приведенный ниже код для небольшого примера использования WMI для событий создания процесса:

static void Main(string[] args)
{
  using (ManagementEventWatcher eventWatcher =
            new ManagementEventWatcher(@"SELECT * FROM 
   __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"))
  {
    // Subscribe for process creation notification.
    eventWatcher.EventArrived += ProcessStarted_EventArrived; 
    eventWatcher.Start();
    Console.In.ReadLine();
    eventWatcher.EventArrived -= ProcessStarted_EventArrived;
    eventWatcher.Stop();
  }
}


static void ProcessStarted_EventArrived(object sender, EventArrivedEventArgs e)
{
  ManagementBaseObject obj = e.NewEvent["TargetInstance"] as ManagementBaseObject;

  // The Win32_Process class also contains a CreationDate property.
  Console.Out.WriteLine("ProcessName: {0} " + obj.Properties["Name"].Value);
}

НАЧАТЬ РЕДАКТИРОВАНИЕ:

Я дополнительно исследовал обнаружение создания процесса с помощью WMI, и существует (более) дружественное решение для ресурсов (но требует административных привилегий) с использованием класса Win32_ProcessStartTrace (см. TECHNET для получения дополнительной информации):

using (ManagementEventWatcher eventWatcher =
          new ManagementEventWatcher(@"SELECT * FROM Win32_ProcessStartTrace"))
{
  // Subscribe for process creation notification.
  eventWatcher.EventArrived += ProcessStarted_EventArrived;
  eventWatcher.Start();
  Console.Out.WriteLine("started");
  Console.In.ReadLine();
  eventWatcher.EventArrived -= ProcessStarted_EventArrived;
  eventWatcher.Stop();
}

static void ProcessStarted_EventArrived(object sender, EventArrivedEventArgs e)
{               
  Console.Out.WriteLine("ProcessName: {0} " 
          + e.NewEvent.Properties["ProcessName"].Value);     
}

В этом решении вам не нужно устанавливать интервал опроса.

END EDIT

НАЧАЛО РЕДАКТИРОВАНИЯ 2:

Вы можете использовать класс Win32_ProcessStopTrace для мониторинга событий остановки процесса.Чтобы объединить события запуска и остановки процесса, используйте класс Win32_ProcessTrace.В обработчике событий используйте пробел ClassPath, чтобы различать события запуска / остановки:

using (ManagementEventWatcher eventWatcher =
       new ManagementEventWatcher(@"SELECT * FROM Win32_ProcessTrace"))
{          
  eventWatcher.EventArrived += Process_EventArrived;
  eventWatcher.Start();
  Console.Out.WriteLine("started");
  Console.In.ReadLine();
  eventWatcher.EventArrived -= Process_EventArrived;
  eventWatcher.Stop();
}

static void Process_EventArrived(object sender, EventArrivedEventArgs e)
{
  Console.Out.WriteLine(e.NewEvent.ClassPath); // Use class path to distinguish
                                               // between start/stop process events.
  Console.Out.WriteLine("ProcessName: {0} " 
      + e.NewEvent.Properties["ProcessName"].Value);     
}

END EDIT 2

2 голосов
/ 15 января 2012

Нет необходимости вообще что-либо контролировать.Все, что вам нужно сделать, это перечислить ваши процессы и извлечь их из экземпляров процесса StartTime .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...