dodání ihned! nové
Hledáme programátora do rostoucího týmu ITnetwork.cz, 100% home office, 100% flexibilní pracovní doba. Více informací

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

Aktivity
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
Petr Čech
Redaktor
Avatar
Odpovídá na Dog
Petr Čech: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
26.10.2016 23:26
the cake is a lie
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
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Dog
Petr Čech: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
the cake is a lie
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.