Я пишу программу, которая должна зарегистрировать время начала процесса, например блокнот. Я думал, что хорошо создать таймер, который проверяет все процессы каждую секунду. Но я думаю, что это замедлит работу компьютера пользователя. Есть ли лучший способ сделать это?Лучший способ зарегистрировать время начала процесса?
ответ
Первоначально определите для всех запущенных процессов время создания. Затем использует 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);
}
НАЧАТЬ EDIT: обнаружение создания процесса
Я дальше изученного с помощью 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
НАЧАТЬ EDIT 2:
Вы можете использовать Win32_ProcessStopTrace
класс контролировать процесс остановки событий. Чтобы объединить оба процесса и события остановки процесса, используйте класс Win32_ProcessTrace
. В обработчик событий с помощью ClassPath
proberty различать старт/стоп события:
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
-1 первый WMI делает внутренний пул. Во-вторых, вам не нужно даже использовать WMI. ОС уже записывает время начала каждого процесса. Все, что вам нужно сделать, это прочитать его. См. Мой ответ ниже. –
Спасибо. Есть ли способ проверить процессы закрытия тоже? –
@ MoctavaFarzán: Да, также есть событие __InstanceDeletionEvent. Но если вы планируете использовать как __InstanceDeletionEvent, так и __InstanceCreationEvent, вы должны подписаться на __InstanceOperationEvent, а затем проверить свой обратный вызов, какое событие было уволено, оценив свойство e.NewEvent.ClassPath.ClassName. – Hans
Там нет необходимости контролировать что-либо вообще. Все, что вам нужно сделать, - перечислить процессы и выборки из экземпляров процесса StartTime.
Но вам, безусловно, нужно использовать таймер или что-то в этом роде? Перечислить процессы один раз недостаточно. Итак, я не понимаю, почему вы проголосовали за мой ответ? – Hans
Есть способы достичь этого без таймера. Основная проблема с вашим ответом заключается в том, что с «__InstanceCreationEvent WITHIN 1» вы делаете опрос каждую секунду. Если процесс начинается и останавливается в течение этого времени, вы никогда не получите никакого уведомления. Если вы знаете, какой процесс вы хотите проверить, вы можете получить обратный вызов из ОС при использовании параметров выполнения файлов изображений. Но сначала Фарзан должен указать, как он получает рассматриваемые процессы и которые ему интересны. Есть много способов добиться этого. –
Да, я aggree. Существует множество решений, таких как Параметры выполнения файлов изображений, Крючки, опрос с использованием таймера, использование WMI или использование драйвера. Итак, я действительно не понял твоего голоса. – Hans
- 1. Время начала процесса
- 2. Истекшее время с момента начала процесса
- 3. AS3: Лучший способ зарегистрировать прослушиватели
- 4. Как получить время начала процесса SQL?
- 5. Как получить время начала процесса в powershell
- 6. iOS - получить время начала процесса после факта
- 7. Программно вычислить время начала процесса в Windows
- 8. Идентификатор процесса процесса Начал с начала процесса
- 9. Лучший способ зарегистрировать пользователя в Django
- 10. Лучший способ зарегистрировать checkbox в спискеView
- 11. Лучший способ зарегистрировать событие в Angular
- 12. Лучший способ представлять время
- 13. Лучший способ автоматизации процесса почтового отправления
- 14. Задержка начала процесса до завершения родительского процесса
- 15. Лучший и экономичный способ запуска долгого процесса
- 16. Лучший способ создания @ApplicationScoped запланированного процесса
- 17. Лучший способ отслеживания процесса для запуска
- 18. Лучший способ реализовать выход процесса в рубин
- 19. Как получить время начала и окончания каждого процесса?
- 20. Лучший способ расчета UTC время
- 21. Лучший способ получить абсолютное время?
- 22. Лучший способ сохранить время недели
- 23. Время до начала времени начала
- 24. время начала и время начала запроса
- 25. Как получить время начала и окончания процесса ssis
- 26. Python: с учетом pid получить время начала пользовательского процесса
- 27. Печати идентификатора процесса только начала процесса до его выхода
- 28. Лучший способ зарегистрировать различные типы пользователей asp.net mvc
- 29. Лучший способ зарегистрировать JS модульности в пользовательский элемент управления
- 30. Лучший способ зарегистрировать время, когда атрибут был изменен в записи в Rails?
Да, постоянный опрос является неправильным решением по многим причинам, не последним из которых является ухудшение производительности. Вы ищете крючок. Но вы не можете написать DLL-ссылку на C#; вам нужно использовать для этого C или C++. –
Какую цель ставите перед собой? Трудно дать вам ответ, который решает вашу проблему. Вы хотите отслеживать запуск любого процесса или только начало определенного процесса? Вам нужно точно выполнить время выполнения контролируемых процессов или вас интересуют только процессы, которые работают дольше, например. 10 минут? В зависимости от вашего ответа может оказаться, что опрос является «хорошим» компромиссом. Есть точные способы сделать это, но они значительно сложнее. –
Извините, ** Английский язык для меня трудно. Я хочу измерить время запуска процесса и зарегистрировать его в txt-файле. Но я не хочу проверять его каждую секунду. –