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 - zakázání vícenásobného spuštění aplikace

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:22.6.2017 14:11

Ahoj,

chtěl jsem se zeptat jak zakážu aby nešla aplikace vícenásobně spustit (tzn. pokud jí už mám spuštěnou a znovu poklepu na exe tak se nespustí :-) )??
Našel jsem zde tento článek .
Ale zdá se mi zbytečně složitý. Myslím si, že jsem to kdysi nastavoval ve vlastnostech projektu... ale teď to ve visual 2015 nemohu najít. Díky za pomoc.

 
Odpovědět
22.6.2017 14:11
Avatar
HONZ4
Člen
Avatar
Odpovídá na Michaal.K
HONZ4:22.6.2017 20:56

Jedna z možností:

using System;
using System.IO.Pipes;
using System.Windows.Forms;
using System.Threading.Tasks;

namespace JenJednou
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            try
            {
                NamedPipeServerStream server = new NamedPipeServerStream("myPipeServerStream");
                Task.Factory.StartNew(() =>
                {
                    while (true)
                    {
                        server.WaitForConnection();
                        server.Disconnect();
                    }
                });
            }
            catch (Exception)
            {
                return;
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
22.6.2017 20:56
Avatar
Filip
Člen
Avatar
Filip:22.6.2017 22:05

Dalsia moznost:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
using System.Threading;


namespace LenRaz

        static class Program
        {

        static Mutex mutex;

         /// <summary>
        /// The main entry point for the application.
        /// </summary>
          [STAThread]
          static void Main()
         {
            try
           {
            if (!IsAlreadyRunning())
              {
               Application.EnableVisualStyles();
               Application.SetCompatibleTextRenderingDefault(false);
               Application.Run(new Form1());
               }
              else
              {
                 MessageBox.Show("Program je mozne spustit iba raz.", "Varovanie", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 Application.Exit();
              }
                }
                 catch { }

             }
          private static bool IsAlreadyRunning()
          {
            string strLoc = System.Reflection.Assembly.GetExecutingAssembly().Location;
            FileSystemInfo fileInfo = new FileInfo(strLoc);
            string sExeName = fileInfo.Name;
            bool bCreatedNew;

            mutex = new Mutex(true, "Global\\" + sExeName, out bCreatedNew);
            if (bCreatedNew)
                mutex.ReleaseMutex();

            return !bCreatedNew;
        }

    }
Editováno 22.6.2017 22:08
 
Nahoru Odpovědět
22.6.2017 22:05
Avatar
Michaal.K
Člen
Avatar
Odpovídá na HONZ4
Michaal.K:23.6.2017 9:59

Díky za kód. Jen jsem tě chtěl poprosit o vysvětlení kódu, moc mu nerozumím a nerad bych bezhlavě kopíroval kód aniž bych nevěděl jak funguje. Díky

Teď nevím, které řešení zvolit :-)
Díky

 
Nahoru Odpovědět
23.6.2017 9:59
Avatar
HONZ4
Člen
Avatar
Odpovídá na Michaal.K
HONZ4:23.6.2017 21:24

Ani ti nepovím, takto jsem to kdysi někde našel. A mám to použito v jednom projektu a vím že to funguje.

Podle mě by to mělo stačit i takto:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        try
        {
            //tady se program pokusí vytvořit 'pojmenovanou komunikační rouru'
            //ta se používá ke komunikaci mezi aplikacemi
            NamedPipeServerStream server = new NamedPipeServerStream("myPipeServerStream");
            //pokud se jí nepodaří vytvořit (většinou proto, že již existuje)
            //vyvolá to chybu
        }
        catch (Exception)
        {
            return; //tady se Main ukončí (tím se ukončí celá aplikace)
        }

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

vlastně smysl proč je tam StartNew nevidím.

Editováno 23.6.2017 21:25
 
Nahoru Odpovědět
23.6.2017 21:24
Avatar
Michaal.K
Člen
Avatar
Odpovídá na HONZ4
Michaal.K:27.6.2017 14:58

Super díky moc...

 
Nahoru Odpovědět
27.6.2017 14:58
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 6 zpráv z 6.