Есть ли способ зарегистрировать событие, которое запускается при запуске исполняемого файла определенного имени файла? Я знаю, что достаточно легко получить событие, когда процесс завершается, получая дескриптор процесса и регистрируясь для выходящего события. Но как вы можете получать уведомления, когда процесс, который еще не запущен, запускается ... без опроса всех запущенных процессов?События .NET для запуска исполняемого файла процесса
ответ
Вы можете использовать следующее:
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 ManagementEventWatcher WatchForProcessEnd(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceDeletionEvent " +
"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 += ProcessEnded;
watcher.Start();
return watcher;
}
private void ProcessEnded(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 ended", processName));
}
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));
}
Вы бы затем вызвать либо WatchForProcessStart и/или WatchForProcessEnd передавая свое имя процесса (например, "notepad.exe").
Объект ManagementEventWatcher возвращается из двух методов Watch *, поскольку он реализует IDisposable и поэтому вы должны вызывать Dispose на этих объектах, когда вы закончили с ними, чтобы предотвратить проблемы.
Вы также можете изменить значение опроса в запросах, если вам нужно, чтобы событие было увеличено быстрее после начала процесса. Чтобы сделать это, измените строку «ВИН 10» на то, что будет меньше 10.
WMI может создавать события при создании процессов. Затем вы можете отфильтровать эти события.
Пример будет приятным :) –
@Adam: Я ожидал этого комментария. К сожалению, прошло некоторое время с тех пор, как я работал с событиями WMI (годы), а не с .NET, поэтому мне пришлось бы научиться самому делать это ... и не иметь времени на данный момент. – Richard
Вот код.
Обратите внимание, что для выполнения этого кода необходимо запустить Visual Studio, например, Administrator.
using System;
using System.Management;
namespace AppLaunchDetector
{
class Program
{
static void Main(string[] args)
{
ManagementEventWatcher w = null;
WqlEventQuery q;
try
{
q = new WqlEventQuery();
q.EventClassName = "Win32_ProcessStartTrace";
w = new ManagementEventWatcher(q);
w.EventArrived += new EventArrivedEventHandler(ProcessStartEventArrived);
w.Start();
Console.ReadLine(); // block main thread for test purposes
}
catch (Exception ex)
{
}
finally
{
w.Stop();
}
}
static void ProcessStartEventArrived(object sender, EventArrivedEventArgs e)
{
foreach (PropertyData pd in e.NewEvent.Properties)
{
Console.WriteLine("\n============================= =========");
Console.WriteLine("{0},{1},{2}", pd.Name, pd.Type, pd.Value);
}
}
}
}
- 1. Получить дескриптор файла для запуска исполняемого файла
- 2. Использование CreateProcess для запуска исполняемого файла
- 3. Получение идентификатора процесса из исполняемого файла оболочки?
- 4. Предотвращение нескольких экземпляров процесса одного исполняемого файла
- 5. Запуск исполняемого файла программно .NET
- 6. Python: Использование wmi для запуска исполняемого файла удаленно
- 7. Загрузка .NET 4.5 исполняемого файла с Java
- 8. VS2013: Запуск исполняемого файла после запуска отладки
- 9. Использование Python для запуска исполняемого файла и заполнения ввода пользователем
- 10. Запуска/убийство исполняемого с помощью .bat файла
- 11. Запуск процесса для запуска
- 12. Xcode 4 - Ошибка запуска исполняемого файла
- 13. Изменение каталога запуска исполняемого файла в MSVC
- 14. Как установить приоритет процесса при запуске исполняемого файла из командного файла в Windows без запуска терминала
- 15. Выполнение .NET-процесса через
- 16. Остановить командную строку Windows после «запуска» после запуска исполняемого файла?
- 17. Инструкции по выполнению исполняемого файла .NET?
- 18. Модифицировать метаданные программным способом (исполняемого файла .net)
- 19. Как сопоставить кнопки в html для запуска исполняемого файла
- 20. Каковы минимальные системные требования для запуска исполняемого файла приложения Kinect?
- 21. Java Runtime.getRuntime(). Exec для запуска 'c исполняемого файла' с параметрами
- 22. Использование proc_open() для запуска исполняемого файла C в PHP
- 23. Пакетный файл для копирования и запуска исполняемого файла по архитектуре
- 24. Запуск оболочки из приложения Android для запуска отдельного исполняемого файла
- 25. Как настроить задание cron для запуска исполняемого файла каждый час?
- 26. Каковы минимальные разрешения unix для запуска исполняемого файла jar?
- 27. Ruby-код для запуска исполняемого файла в Ubuntu12
- 28. Пакетный файл для запуска исполняемого файла с временным интервалом
- 29. Получение исполняемого файла банка для запуска после создания из NetBeans
- 30. Использование подпроцесса для запуска исполняемого файла с флагом
Этот код может быть реорганизован, но я оставил его многословным, чтобы надеяться на понимание. – Clive
Теперь это ответ! Благодаря! –
На самом деле этот код выглядит хорошо. Но это не работает для меня. Мне не хватает какой-либо точки? win7, net 2.o. – Yaya