Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Programm nicht mehrmals starten (.Net)

Moderationshinweis von herbivore (14.07.2007 - 16:05:36):

Dies ist ein Thread, auf den aus der FAQ verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!

Lars Schmitt
myCSharp.de - Experte

Avatar #avatar-2240.jpg


Dabei seit:
Beiträge: 2335
Herkunft: Witten

Themenstarter:

Programm nicht mehrmals starten (.Net)

beantworten | zitieren | melden

Beschreibung:

Aus den tiefen meiner Sourcen wieder mal ein kleiner Snippet

Es könnte ja mal passieren, dass Ihr nicht wollt das euer Programm mehrmals gestartet wird.

Hier ist die Lösung per .Net Boardmitteln

bool createdNew;

System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out createdNew);
if (createdNew) {
	// bitte Form1 ersetzen 
	Application.Run(new Form1());
        // und auch wieder Freigeben besser ist besser
        mutex.ReleaseMutex();
} else {
	MessageBox.Show("Programm wurde bereits gestartet!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Schlagwörter: Mutex, Programm, single, einmal, 2. Instanz verhindern

Quelle: .NET-Snippets
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 4055
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

Bitte auch hier zwingend drauf achten, dass der Mutex bis zum Programmende am leben erhalten wird.

Siehe auch:
mehrere Programminstanzen verhindern?
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Wer die andere Instanz benachrichtigen will, kann man das über windowsmeldungen tun:

string name = Assembly.GetExecutingAssembly().GetName().Name;
                int currentId=Process.GetCurrentProcess().Id;
                EnumThreadDelegate callbackDelegate=new EnumThreadDelegate(Callback);
                foreach(Process p in Process.GetProcessesByName(name))
                {
                    if (p.Id != currentId)
                    {
                        IntPtr mainwindowHandle = p.MainWindowHandle;
                        if (mainwindowHandle != IntPtr.Zero)
                        {
                            SendMessage(mainwindowHandle,
                                0x8000 + 1,//WM_APP + x = deineMeldung
                                (IntPtr)(0), (IntPtr)(0)//Parameter
                                );
                        }
                        //Wenn die Anwendung kein eingetragenes hauptfenser hat:
                        else
                        {
                            foreach (ProcessThread thread in p.Threads)
                            { EnumThreadWindows(thread.Id, callbackDelegate, (IntPtr)0); }
                        }
                        //---
                    }
                }

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
        static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam);

        //Wenn die Anwendung kein eingetragenes hauptfenser hat:

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);

        public delegate int EnumThreadDelegate(IntPtr hwnd, IntPtr lParam);

        public static int Callback(IntPtr handle,IntPtr garbage)
        {
            SendMessage(handle, 0x8000+1, (IntPtr)(0), (IntPtr)(0));
            return 1;
        }

Zum Empfangen muss wndproc überschrieben werden oder ein messagefilter hinzugefügt werden.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Floste am .
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo blackcoin,

statt Application.ProductName sollte man eine besser eine GUID verwenden, um Konflikte zwischen Programmen mit (zufällig) gleichem ProductName auszuschließen.

herbivore
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

Nur aus reiner Vorsicht:
Zitat von herbivore
statt Application.ProductName sollte man eine besser eine GUID verwenden
Diese sollte aber natürlich statisch sein und nicht bei jeder Mutexerzeugung neu erzeugt werden.
private Nachricht | Beiträge des Benutzers