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

Avatar
Dog
Člen
Avatar
Dog:

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. října 22:00
Avatar
Odpovídá na Dog
Petr Čech (czubehead):
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. října 23:26
Why so serious? -Joker
Avatar
Dog
Člen
Avatar
Dog:

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. října 0:32
 
Nahoru Odpovědět 27. října 0:30
Avatar
Radek Chalupa:

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. října 7:13
Avatar
Odpovídá na Dog
Petr Čech (czubehead):

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. října 13:43
Why so serious? -Joker
Avatar
Dog
Člen
Avatar
Dog:

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. října 21:39
 
Nahoru Odpovědět 27. října 21:39
Avatar
Dog
Člen
Avatar
Dog:

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. října 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.