Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: Zavřít okno, jakmile skončí Process

C# .NET .NET (C# a Visual Basic) Zavřít okno, jakmile skončí Process American English version English version

Aktivity (1)
Avatar
Dog
Člen
Avatar
Dog:26.10.2016 22:00

Ahoj, potřebuji zavřít okno v mém programu jakmile skončí okno v software, na které je vázané...
Když vytvořím okno, které má název IdTurnaje, tak se na něj naváže a nezavře se, jakmile ale spustím se softwarem, se kterým mám tak vydrží otevřené jen chvíli ale nikdy nevydrží déle než 5 minut...
Proto jsem se to snažil opatřit:

if (close)
    pocetzavreni++;

if (pocetzavreni > 25)
    Close();

Ale nepomohlo to a stále se to zavírá s tím, že to dřív nevydrželo déle než 2 minuty, nyní nevydrží déle než 5 minut... Myslíte, že by mohla být chyba třeba v té funkci? IdTurnaje se inicializuje jen v konstruktoru...

//Timer.Tick += ZavritKdyzZmiziZProcesu;
void ZavritKdyzZmiziZProcesu()
{
Process[] processlist = Process.GetProcesses();

            foreach (var proclist in processlist)
            {
                if (!String.IsNullOrEmpty(proclist.MainWindowTitle))
                {
//IdTurnaje je část názvu okna
//doplnuje ho trida
                    if (proclist.MainWindowTitle.ToString().Contains(IdTurnaje))
                    {
                        close = false;
                        break;
                    }
                }

                close = true;
            }

            if (close)
                pocetzavreni++;
            else
                pocetzavreni = 0;

            if (pocetzavreni > 25)
                Close();
}
 
Odpovědět 26.10.2016 22:00
Avatar
Odpovídá na Dog
Petr Čech (czubehead):26.10.2016 23:26
close=true ;

dej před celý ten cyklus, takto ho nastavuješ na True zcela nezávisle na tom, jestli jsou nějaké podmínky splněné.

Nahoru Odpovědět  +1 26.10.2016 23:26
Why so serious? -Joker
Avatar
Dog
Člen
Avatar
Dog:27.10.2016 0:30

Jojo to všechno mám...
Je to nastavený na false, ale je to tam. Je jsem to nedal do toho kódu, je to mimo tu funkci.
Právě nevím čím to je...

Editováno 27.10.2016 0:32
 
Nahoru Odpovědět 27.10.2016 0:30
Avatar
Radek Chalupa:27.10.2016 7:13

Nebylo by nejlepší ten "software" spustit pomocí objektu Process a použít metodu WaitForExit?
Jinak problém může být že hledáš ten proces pomocí textu okna, který se může měnit (aplikace běžně do titulku vypisují třeba název otevřeného souboru atd.). Určitě bych to testoval na název třídy okna (tu zjistíš např. pomocí Spy++). Tj. vzít property MainWindowhandle a pak GetClasName (na pinvoke.net najdeš jak ji naimportovat).

Radek Chalupa

  • individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC)
  • vývoj software na zakázku

http://www.radekchalupa.cz

 
Nahoru Odpovědět 27.10.2016 7:13
Avatar
Odpovídá na Dog
Petr Čech (czubehead):27.10.2016 13:43

Jenže v tom cyklu to být nesmí, takto se to nastaví na true po každé iteraci nezávisle na tom, zda byla splněna podmínka nebo ne.

Nahoru Odpovědět 27.10.2016 13:43
Why so serious? -Joker
Avatar
Dog
Člen
Avatar
Dog:27.10.2016 21:39

Stále stejnej problém... Když otevřu okno z forms, který má stejný údaje tak se nezavře, jakmile ale spustím aplikaci kvůli které jsem to udělal tak se to okno (v mým software) přichytne na okno v aplikaci, ale po chvíli se zavře, i když je to okno v té aplikaci pořád otevřené a má stále stejnej MainWindowTitle... Nechápu :-(

Process[] processlist = Process.GetProcesses();
bool close = true;

foreach (var proclist in processlist)
{
    if (proclist.MainWindowTitle.ToString().Contains(IdTurnaje))
    {
        close = false;
        break;
    }
}

if (close)
    Close();
Editováno 27.10.2016 21:39
 
Nahoru Odpovědět 27.10.2016 21:39
Avatar
Dog
Člen
Avatar
Dog:28.10.2016 0:54

Nakonec jsem to vyřešil trosku krkolomně, ale funguje to :)

Process[] processlist = Process.GetProcesses();
            bool close = true;
            Process process = new Process();
            foreach (var proclist in processlist)
            {
                if (proclist.MainWindowTitle.ToString().Contains(IdTurnaje))
                {
                    process = proclist;
                    close = false;
                    break;
                }
            }

            if (close)
                pocet++;
            else
                pocet = 0;

            if (pocet > 60)
                Close();
 
Nahoru Odpovědět 28.10.2016 0:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.