Detekce spuštěného ext. programu a jeho ukončení.   zodpovězená otázka

VB.NET

Dobrý den, marně hledám nějaký protiklad spouštění externích programů. Spuštění mi funguje takto shell("C:\Program.exe)

Ale pokud chci zavřít (ukončit) program, který jsem nespustil z aplikace, tak si nevím rady. Našel jsem něco ve smyslu kill("C:\Program.exe), ale to mi hlásí chybu.

Druhá věc jej nejdřív detekovat, to jsem také nenašel.

Předem děkuji za radu jak bych mohl detekovat určitý program jestli je spuštěn a ev. jej ukončit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý večer,

na to jsem už odpovídal zde:

http://www.vbnet.cz/forum-tema--86-prehr...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpověď, tento kód funguje.

Private Proc As Process

	Private Sub Spustit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Spustit.Click
		Proc = System.Diagnostics.Process.Start("calc.exe")
	End Sub

	Private Sub Zavrit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Zavrit.Click
		Proc.CloseMainWindow()
	End Sub

ale nevím jak z něj dostat ukončení programu, který jsem z aplikace sám nepustil, tj. program není pojmenovaný.

Také jakým způsobem jde ověřit, zda nějaký program je už spuštěn a pokud ano, tak jej zavřít.

Děkuji za ochotu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nakonec jsem našel tento kód a zdá se že to funguje.

Dim myProcesses() As Process
        Dim myProcess As Process
        Dim teller As Integer = 0
        '' Returns array containing all instances of "Notepad".
        myProcesses = Process.GetProcessesByName("Notepad")
        For Each myProcess In myProcesses
            myProcess.CloseMainWindow()
            teller += 1
        Next
        If teller > 0 Then
            MessageBox.Show("closed")
        Else
            MessageBox.Show("Nothing to be closed")
        End If

Ale není mi jasné, jak se rozpozná více spuštění, případně mi připadne rozpoznávání podle názvu divné, spíš bych řekl, že by to mělo být jednoznačně podle cesty.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý večer,

více spuštění se řeší v uvedeném kódu tak, že se uzavřou všechny instance. Konkrétně to zajišťuje tato smyčka:

        For Each myProcess In myProcesses
            myProcess.CloseMainWindow()
            teller += 1
        Next

Pokud chcete procesy nějak dále třídit, tak objekt Process má spoustu vlastností, které popisují spuštěný proces. Například StartTime, který určuje kdy byl spuštěn atp.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím,

ať dělám co dělám, tak jdou zavřít jen některé programy a to: notepad, excel atd, ale jiné programy třetích stran na to vůbec nereagují.

Nevím jestli jsem něco neopomněl nebo nepřehlédl.

Díky za tip

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A jsou pozadovane programy v kolekci procesu MyProcesses? Mozna jste spatne zadal jmeno programu a tak se nenalezly procesy, ktere se maji ukoncit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jména by měly být snad v pořádku. Nechal jsem si je vypsat pomocí:

Msgbox(myProcess2.ToString)

System.Diagnostics.Process (notepad)

System.Diagnostics.Process (miranda32)

System.Diagnostics.Process (thebat)

atd

možná je něco špatně, nebo nestandartně v mém kódu

Dim myProcesses2() As Process
        Dim myProcess2 As Process
        
        Dim vsechnyProcesy2 As String = ""
        myProcesses2 = Process.GetProcesses
        For Each myProcess2 In myProcesses2
            vsechnyProcesy2 = vsechnyProcesy2 & Environment.NewLine & myProcess2.ToString
          
            If myProcess2.ToString = "System.Diagnostics.Process (thebat)" Then
                myProcess2.CloseMainWindow()
                MsgBox(myProcess2.ToString)
            End If
        Next
        

        MsgBox(vsechnyProcesy2)

Podmínka s myProcess2.ToString = "System.Diagnostics.Process (thebat)" asi nebude uplně standartní, ale nevím proč by neměla fungovat, když se splní a msgbox vypíše správnou zprávu.

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To by mělo být správně. Chyba bude pravděpodobně ve volání CloseMainWindows. To uzavře jen hlavní okno. Zkuste použít místo toho buď Close nebo Kill.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky nevím proč mě to nenapadlo to Kill dřív, když jsem to někde četl.

Kill funguje na nějaké programy, které jsem neshodil closeMainWindows, ale na některé programy zase nefunguje.

Vyhodí je z procesů, ale ve spuštěných aplikacích zůstane.

Také mám obavu, že kill to zavírá natvrdo, okamžitě.

No nevím ... uvidím, třeba se mi podaří něco najít.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To ano, kill to zavre natvrdo. A Close nefunguje?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Close() mi bohužel nefunguje ani na notepad :(

Asi se bez toho zavření budu muset obejít, budu jen ověřovat jesti aplikace není otevřená a uživatel ji ev. bude muset zavřít sám.

Každopádně díky moc za radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem se podíval na MSDN (http://msdn2.microsoft.com/en-us/library... ) a v ukázce mají nejdříve zavoláno CloseMainWindow a pak ještě volají Close. Protože CloseMainWindow jen zavře dané okno, ale všechny aplikace nejsou napsané tak, aby se po zavření okna ukončily, je tedy nutné zavolat Close. Težko říci, jestli to takto funguje, ale mohlo by.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Musíte zkusit CloseMainWindow, pak Close a pokud to nepomůže, tak Kill. Takto mi to funguje na všem co jsem zkoušel. Samozřejmě nemůžete zavírat důležité systémové procesy.

A ještě se vrátím k úplně prvnímu příspěvku. Psal jste, že nešlo použít samostatný příkaz Kill. To je ale příkaz na mazání souborů, tak pozor!

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za rady, tak jsem se donutil to ještě pořádně otestovat a zjistil jsem, že některé programy mají více procesů a že je potřeba zavřít všechny tyto procesy, aby se program kompletně vypnul.

Stačilo to CloseMainWindow a pak Close.

Snad je to tímto vyřešeno. Díky za pomoc.

Prosím o označení jako zodpovězeno, díky

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback