Czy istnieje sposób rejestracji zdarzenia, które zostanie wywołane po uruchomieniu pliku wykonywalnego o określonej nazwie? Wiem, że łatwo jest uzyskać zdarzenie, gdy proces się kończy, przez uzyskanie obsługi procesu i zarejestrowanie się na zdarzenie zakończone. Ale jak możesz zostać powiadomiony, kiedy proces, który jeszcze nie działa, zaczyna się ... bez odpytywania wszystkich uruchomionych procesów?. Zdarzenia .NET do uruchomienia pliku uruchamialnego
Odpowiedz
Można użyć następujących:
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));
}
Będziesz wtedy zadzwonić albo WatchForProcessStart i/lub WatchForProcessEnd przekazując swoją nazwę procesu (np "notepad.exe").
Obiekt ManagementEventWatcher jest zwracany z dwóch metod Watch *, ponieważ implementuje IDisposable, więc powinieneś wywołać Dispose na tych obiektach, gdy skończyłeś z nimi, aby zapobiec problemom.
Możesz również zmienić wartość pollingu w zapytaniach, jeśli chcesz, aby zdarzenie zostało podniesione szybciej po rozpoczęciu procesu. Aby to zrobić, zmień wiersz "WITHIN 10" na WIĘCEJ mniej niż 10.
Usługa WMI może tworzyć zdarzenia po utworzeniu procesów. Możesz wtedy filtrować te zdarzenia.
Przykład byłby miły :) –
@Adam: Spodziewałem się tego komentarza. Niestety minęło trochę czasu odkąd pracowałem z wydarzeniami WMI (lata), a nie z .NET, więc musiałbym nauczyć się jak to zrobić sam ... i nie mam czasu w tej chwili. – Richard
Oto kod.
Należy zauważyć, że aby uruchomić ten kod, należy uruchomić program Visual Studio, taki jak 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. Pakiet bibliotek .NET do uruchomienia aplikacji w maszynie .NET-less?
- 2. Próba uruchomienia zdarzenia onload na znaczniku skryptu
- 3. Zdarzenia asynchroniczne i .NET?
- 4. Windows Batch Plik do uruchomienia pliku PHP
- 5. wersja .net uruchomienia ramowej nie pasuje .NET Framework projektu inicjującego
- 6. Wzór sygnatury zdarzenia w .net
- 7. Stosować JPEG do uruchomienia obrazy
- 8. Najłatwiejsza/najkrótsza komenda do uruchomienia skryptu PowerShell jako zdarzenia budowania w Visual Studio
- 9. Wyjątek NullPointerException podczas próby uruchomienia pliku .jar
- 10. . Zmiana rozmiaru zdarzenia .NET: stary rozmiar?
- 11. .NET Windows Forms - przechwytywanie zdarzenia Close X
- 12. Jak pisać do pliku w .NET Core?
- 13. Biblioteka NET do wykrywania typu pliku/mime
- 14. Duża macierz do uruchomienia glmnet()
- 15. Vagrant do uruchomienia odtwarzania ramy
- 16. Konfigurowanie Pycharm do uruchomienia Pyinstaller
- 17. Kanbanowe narzędzie (narzędzia) do uruchomienia
- 18. DockerPlik do uruchomienia programu java
- 19. Plik wsadowy do ponownego uruchomienia usługi. Windows
- 20. Pierwsze Jasmine do uruchomienia na stronie serwera
- 21. Wymuszenie uruchomienia aplikacji w określonej wersji środowiska .NET?
- 22. Jak zdobyć trasę do ponownego uruchomienia migracji?
- 23. Typ delegata ogólnego do obsługi dowolnego zdarzenia
- 24. . Odpowiednik curl do .NET do przesłania pliku do REST API?
- 25. Jak przekonwertować CLION do uruchomienia instalacji docelowej?
- 26. Jak uzyskać ścieżkę do uruchomienia programu java
- 27. Potrzebuję zdarzenia do wykrycia połączenia/rozłączenia Internetu
- 28. Użycie .NET do wysłania pliku do serwera HttpWebRequest lub WebClient
- 29. przy użyciu zdarzenia PreSendRequestHeaders w pliku global.asax
- 30. Powolny czas uruchomienia Julii
Ten kod mógł zostać refaktoryzowany, ale pozostawiłem go pełnym gadżetem, aby pomóc w zrozumieniu – Clive
Teraz to jest odpowiedź! Dzięki! –
faktycznie ten kod wygląda dobrze. Ale to nie działa dla mnie. Brakuje mi jakiegoś punktu? win7, net 2.o project. – Yaya