Jak dokładnie wyłączyć aplikację konsolową uruchomioną za pomocą Process.Start?
To wygląda na niemożliwe. Absolutnie nic, co znalazłem. Pytanie brzmi: jak dokładnie zamknąć aplikację konsolową uruchomioną za pomocą Process.Start, która została uruchomiona bez okna konsoli i bez użycia powłoki:ProcessStartInfo.CreateNoWindow = true; ProcessStartInfo.UseShellExecute = false;
).
Podano, że uruchamiana aplikacja zamknie się „czysto”, jeśli otrzyma sygnał ctrl-c lub ctrl-break, ale wydaje się, że nie ma możliwości wysłania go, który działa (szczególnie GenerateConsoleCtrlEvent).
Process.Kill nie działa. Pozostawia za sobą uszkodzone pliki z powodu nagłego zabicia procesu.Process.CloseMainWindow nie działa. W tym przypadku nie ma głównego okna, więc funkcja zwraca false i nic nie robi.Wywołanie EnumThreadWindows na wszystkich wątkach dla procesu i wysłanie WM_CLOSE do każdego okna nic nie robi, a i tak nie ma żadnych okien wątków.GenerateConsoleCtrlEvent nie działa. Jest to przydatne tylko w przypadku procesów w tej samej grupie (której nie kontroluje .NET), z niepożądanym efektem ubocznym zamknięcia procesu wywoływania. Funkcja nie pozwala określić identyfikatora procesu.Ktokolwiek może dostarczyć kod, który akceptuje obiekt „Proces” rozpoczęty z powyższymi parametrami, co powoduje czyste zamknięcie uruchomionego procesu bez wpływu na proces wywoływania, zostanie oznaczony jako odpowiedź. Użyj 7z.exe (archiwizator 7-zip) jako przykładowej aplikacji konsoli, która rozpocznie kompresowanie dużego pliku i pozostawi uszkodzony plik, jeśli nie zostanie zakończony bez problemów.
Dopóki ktoś nie przedstawi funkcjonalnego przykładu lub kodu prowadzącego do funkcjonalnego przykładu, pytanie to pozostaje bez odpowiedzi. Widziałem dziesiątki osób zadających to pytanie i dziesiątki odpowiedzi online, a żadna z nich nie działa. .NET wydaje się nie zapewniać żadnego wsparcia dla czystego zamykania aplikacji konsolowej ze względu na jej identyfikator procesu, co jest dziwne, biorąc pod uwagę, że jest uruchamiany z obiektem procesu .NET. Częścią problemu jest niemożność utworzenia procesu w nowej grupie procesów, co sprawia, że użycie GenerateConsoleCtrlEvent jest bezużyteczne. Musi być na to rozwiązanie.