2010-10-02 11 views
8

Próbuję utworzyć aplikację, która wykona akcje w określonych godzinach (podobnie jak Harmonogram zadań systemu Windows). Obecnie używam Process.Start(), aby uruchomić plik (lub exe) wymagany przez zadanie.Proces Kill rozpoczął się od System.Diagnostic.Process.Start ("FileName")

Inicjuję proces, wywołując plik (.mp3), a proces rozpoczyna się od WMP (ponieważ jest to aplikacja domyślna). Jak na razie dobrze. Teraz chcę zabić ten proces. Wiem, że to normalne zachowanie dla Process.Start (ciąg, ciąg), aby zwrócić nic (null w C#) w tym przypadku.

Pytam więc, w jaki sposób można zamknąć WMP, gdy wywołałem go przez Process.Start (ciąg, ciąg)?

Edit:

Należy pamiętać, że nie jestem otwierając WMP bezpośrednio z Process.Start() i jest to linia, z którymi mogę uruchomić proces:

VB: Me._procs.Add (Process.Start (Me._procInfo))

C# this._procs.Add (Process.Start (this._procInfo))

_procInfo jest wystąpienie ProcessStartInfo. _procInfo.FileName to "C: \ route \ myFile.mp3". Właśnie dlatego otwiera się WMP. W każdym przypadku wszystkie metody Start(), z wyjątkiem instancji zwracającej wartość logiczną, nie zwracają niczego (null w języku C#), ponieważ WMP nie jest procesem, który został bezpośrednio utworzony (należy pamiętać, że WMP jest uruchamiany i piosenka nie odtwarza).

+0

Zgodnie z moją wiedzą, 'Process.Start' zwróci' null', jeśli żaden proces nie został faktycznie uruchomiony, np. istniejący proces został ponownie wykorzystany w celu załadowania dokumentu (w twoim przypadku pliku mp3). Czy naprawdę chcesz zabijać proces, którego twój kod właściwie się nie rozpoczął? – Ani

+0

@Ani - statyczny Start wywołuje wszystkie procesy powrotne, ale funkcja zwracania zwraca wartość bool –

+0

@Steve Townsend: Prawo, ale uważam, że OP mówi o statycznej metodzie. Jeśli odwołanie do niezerowego obiektu 'Process' było już dostępne, problem nie istniałby. – Ani

Odpowiedz

8

Nie rób tego w ten sposób.

Nie jest jasne, czy celem programu jest "Zawsze uruchamiaj z Windows Media Player" lub "Uruchom z zarejestrowanym odtwarzaczem MP3", co może oznaczać, powiedzmy, iTunes.

Jeśli potrzebujesz WMP, użyj Process.Start z pełną ścieżką do Windows Media Player.

Jeśli potrzebujesz zarejestrowanego odtwarzacza MP3, możesz sprawdzić poprawną nazwę exe, korzystając z the code shown here. Ponownie rozpocznij proces od tej ścieżki exe, przekazując MP3 jako parametr.

+0

Tak jak mówimy, dziękuję tutaj, TAK. – PedroC88

+0

Dzięki! Dałeś mi również 3K. :) –

18

Process.Start (ciąg, ciąg) zwraca zasób procesowy, którego można użyć do dalszej kontroli nowego procesu.

Process newProcess = Process.Start("param1", "param2"); 
if (newProcess != null) 
    newProcess.Kill(); 

Ta sama struktura działa jeśli używasz Process.Start(string) lub jakąkolwiek inną statyczne przeciążenie Process.Start.

Process.Start() jest funkcją składową i kojarzy nowy lub ponownie użyty Process z komponentem Process zidentyfikowanym przez to. Zachowanie tej metody zależy od właściwości procesu zidentyfikowanego przez this.

5

dwa sposoby:

1-

Process customProc = Process.Start("ExecutablePath", "Argument(s)"); 
customProc.Kill() 

2-

Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("ProcessName") 
For Each p As Process In pProcess 
p.Kill() 
Next 
+0

Rzecz w tym, że skoro nie jestem tym, który uruchamia program (właśnie wywołuję plik, a Windows obsługuje program, z którym powinien się otworzyć) Process.Start nic nie zwraca (null dla C#). – PedroC88

2

próbowałem otworzyć plik .txt i proces mojego edytora tekstu został zwrócony, również próbowałem. mp3 przez WMP i zwróciło wartość null. To zależy od aplikacji. Czy musisz odtwarzać mp3 tylko z WMP? Jeśli nie, zdecydowanie możesz utworzyć aplikację, która zwróci obiekt Process.

3

Jeśli pozwalasz zarejestrowanemu programowi Windows otworzyć plik, zamiast wybierać odpowiedni program. Potem radzę nie zabijać tego procesu.

Powodem tego jest, że program używa domyślnej aplikacji, ale ta aplikacja jest już w użyciu i zawiera niezapisane dane. Użytkownik nie byłby zadowolony z tego, że twój program prześcignie tam aplikację z nowym plikiem, a następnie zabije proces, który był już używany przez użytkownika w innym celu. Oczywiście, może nie być w użyciu, ale musisz wziąć pod uwagę najgorszy przypadek.

Jako takie, polecam to, co zostało zasugerowane. użyj Process.Start() z pełną ścieżką do używanego programu i pliku do otwarcia.

1

proc = Process.Start(filename) powinien działać, ale jak mówisz, zwraca null zamiast procesu.

To wydaje się być nieodłącznym elementem Windows Media Player. Inne aplikacje zwracają proces. Możesz pobrać proces Windows Media Player, określając aplikację w metodzie start.

proc = Process.Start("C:\Program Files\Windows Media Player\wmplayer.exe", filename) 

Następnie można zabić go normalnie.

proc.Kill() 

Prawdopodobnie będziesz potrzebować uzyskać lokalizację aplikacji przypisanej do plików .mp3 z rejestru.

Powiązane problemy