NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: c# form - ukončení okna příkazového řádku

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michaal.K
Člen
Avatar
Michaal.K:5.4.2017 11:23

Ahoj,
uvnitř mého programu spouštím příkazový řádek s parametrem (tento parametr si může zvolit uživatel), viz. kód níže:

private void spustCMD(string parametrCMD)
        {
            var procCMD = new Process();
            procCMD.StartInfo.FileName = "cmd.exe";
            procCMD.StartInfo.Arguments = "/c " + parametrCMD;
            procCMD.Start();
        }

pokud do parametrCMD vložím notepad.exe, tak se spusti cmd a zaroven poznámkový blok, ale já bych potřeboval po spuštění notepadu ukončit okno cmd. Lze to nějak? Když jsem zkoušel killnout proces cmd tak se mi zavřel i notepad a ten chci nechat otevřený. Díky

 
Odpovědět
5.4.2017 11:23
Avatar
termostat
Člen
Avatar
termostat:5.4.2017 13:12

Nepíšeš jestli chceš takové chování pro všechny předané parametry, nebo speciálně jen pro "notepad.exe", nestačilo by ti toto ?

private void spustCMD(string parametrCMD = null)
{
        Process.Start(parametrCMD ?? "cmd.exe");
}
 
Nahoru Odpovědět
5.4.2017 13:12
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Michaal.K
Petr Nymsa:5.4.2017 13:21

A proč pro otevření jednoho procesu to otevíráš skrze cmd? V ten moment je rodičovský proces CMD a je jasné, že při zavření cmd se zavřou i potomci.

Rovnou můžeš přeci nastartovat notepad z tvé aplikace

Nahoru Odpovědět
5.4.2017 13:21
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Michaal.K
Michal Štěpánek:5.4.2017 17:39

Taky mi není jasné, proč k otevření nějaké aplikace používáš CMD. Proč jednoduše nezavoláš

private void spustaplikaci(string aplikace_kterou_chci_spustit)
{
        Process.Start("aplikace_kterou_chci_spustit");
}
Nahoru Odpovědět
5.4.2017 17:39
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Petr Nymsa
Michaal.K:7.4.2017 7:41

to Petr Nymsa & Michal Štěpánek: spuštění toho notepadu byl jen příklad :-) Uživatel bude moc zadat třeba příkaz ipconfig... Já jsem chtěl pokud se přes cmd otevře nová aplikace tak aby se okno s cmd automaticky zavřelo.
to Petr Nymsa: To stím rodičovským oknem mi funguje nějak jinak, protože pokud ve spuštěné aplikaci provedu spuštění notepadu přes cmd (mám tedy spuštěny tři okna vlastní aplikaci, cmd a notepad) a následně křížkem ukončím cmd tak notepad zůstane spuštěný.
Díky za pomoc a rady...

 
Nahoru Odpovědět
7.4.2017 7:41
Avatar
termostat
Člen
Avatar
termostat:7.4.2017 9:36

Spouštěl bych to s dalším parametrem, kterým zvolíš jestli se má příkaz provést v CMD nebo ne.

private void SpustAplikaci(string aplikace, bool cmd)
{
        if (cmd)
                Process.Start("cmd.exe", "/K " + aplikace);
        else
                Process.Start(aplikace);
}

Pak můžeš volat buď

SpustAplikaci("notepad", false);

Nebo

SpustAplikaci("ipconfig", true);
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
7.4.2017 9:36
Avatar
Michaal.K
Člen
Avatar
Michaal.K:15.5.2017 10:42

Po dlouhé odmlce jsem opět zpátky :-) Tak jsem to nakonec vyřešil takto:

var procCMD = new Process();                                    // Novy proces

if (parametrCMD.Contains("exe"))
{
        procCMD.StartInfo.FileName = parametrCMD;                   // Spustim jako aplikaci
}
else
{                                                               // Pokud neobsahuje koncovku spoustim jako parametr cmd
        procCMD.StartInfo.FileName = "cmd.exe";                     // Spustim CMD
        procCMD.StartInfo.Arguments = "/k " + parametrCMD;          // Parametr se kterym se spusti CMD
}
procCMD.Start();

Díky za pomoc ;-)

 
Nahoru Odpovědět
15.5.2017 10:42
Avatar
Odpovídá na Michaal.K
Michal Štěpánek:15.5.2017 11:06

Trošku bych to poupravil

if (parametrCMD.Contains(".exe"))

nebo tam dej

if (parametrCMD.endsWith("exe"))

protože ten soubor může "exe" obsahovat i v názvu...

Nahoru Odpovědět
15.5.2017 11:06
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Michal Štěpánek
Michaal.K:15.5.2017 11:07

To je pravda. Díky za korekci :-)

 
Nahoru Odpovědět
15.5.2017 11:07
Avatar
Radek Chalupa:15.5.2017 12:56

Nevím zda jsi vyřešil to korektní ukončení okna cmd, pokud ne tak takhle to funguje bez problémů:

internal static class UnsafeNativeMethods
{
        [DllImport("user32.dll", EntryPoint = "SendMessageW", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int zprava, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow(string className, string windowName);
}

private void button1_Click(object sender, EventArgs e)
{
        var process = new System.Diagnostics.Process();
        process.StartInfo.FileName = "cmd.exe";
        process.StartInfo.Arguments = "/c " + "notepad";
        process.Start();
        IntPtr hwnd = IntPtr.Zero;
        for (;;)
        {
                hwnd = UnsafeNativeMethods.FindWindow("ConsoleWindowClass", null);
                if (hwnd == IntPtr.Zero)
                        break;
                UnsafeNativeMethods.SendMessage(hwnd, 0x0010 /*WM_CLOSE*/, IntPtr.Zero, IntPtr.Zero);
        }
}

Radek Chalupa
www.radekchalupa.cz

 
Nahoru Odpovědět
15.5.2017 12:56
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 10 zpráv z 10.