myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » Programm nicht mehrmals starten (.Net)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Programm nicht mehrmals starten (.Net)

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
myCSharp.de
Moderationshinweis von herbivore (14.07.2007 16:05):

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 Lars Schmitt ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2240.jpg


Dabei seit: 11.10.2005
Beiträge: 2.223
Entwicklungsumgebung: Visual Studio 2013
Herkunft: Witten


Lars Schmitt ist offline

Programm nicht mehrmals starten (.Net)

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
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
30.04.2007 10:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Jahr.
kleines_eichhoernchen kleines_eichhoernchen ist männlich
myCSharp.de-Mitglied

avatar-2079.jpg


Dabei seit: 07.11.2006
Beiträge: 3.971
Entwicklungsumgebung: Visual Studio 2005 (C#)
Herkunft: Ursprünglich Vogtland, jetzt Much


kleines_eichhoernchen ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Siehe auch:
 mehrere Programminstanzen verhindern?
06.01.2009 14:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Floste
myCSharp.de-Mitglied

avatar-2376.jpg


Dabei seit: 13.06.2007
Beiträge: 1.130
Entwicklungsumgebung: VS 2008
Herkunft: Norddeutschland


Floste ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
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 09.01.2009 18:23.

09.01.2009 18:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 6 Monate.
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.484
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo blackcoin,

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

herbivore
20.07.2009 13:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
winSharp93 winSharp93 ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2918.png


Dabei seit: 19.01.2007
Beiträge: 5.742
Herkunft: Stuttgart


winSharp93 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
20.07.2009 14:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 13 Jahre.
Der letzte Beitrag ist älter als 11 Jahre.
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.01.2021 07:33