Feedback

C# - Programm nicht mehrmals starten (Kernel32.dll)

Veröffentlicht von am 08.12.2006
(3 Bewertungen)
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 Kernel32.dll
GFU-Schulungen  [Anzeige]

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

C# Komplett

Sie kennen sich in objektorientierter Programmierung aus. Sie schreiben C++ oder Java? Und nun stehen Sie vor der Aufgabe, in C# Anwendungen zu erstellen. Das C# Komplett-Seminar verschafft Ihnen umfassende Programmierkenntnisse in dieser Sprache. Nach der Schulung entwickeln Sie selbständig Anwendungen mit C#. Sie kennen die Datentypen und Klassenbibliotheken der objektorientierten Programmiersprache C#. Der Komplettkurs setzt bei den Grundlagen von C# ein. Sie arbeiten mit Variablen und konvertieren Typen. Multithreading, Delegates, Generics sind nach dem Seminar für Sie kein Geheimnis mehr.

static class Program {
       
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateMutex( IntPtr lpMutexAttributes, bool bInitialOwner, string lpName );

[DllImport("kernel32.dll")]
static extern bool ReleaseMutex( IntPtr hMutex );

const int PRG_RUNNING = 183;

[STAThread]
static void Main() {
	IntPtr mutex = IntPtr.Zero;

	try {
		mutex = CreateMutex(IntPtr.Zero, false, Application.ProductName);

		if (mutex != IntPtr.Zero) {
			if (Marshal.GetLastWin32Error() != PRG_RUNNING) {
				// Programm läuft noch nicht, kann also richtig gestartet werden
				// Bitte durch eigene Form ersetzen
				Application.Run(new Form1());
			} else {
				MessageBox.Show("Programm wurde bereits gestartet!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}
	} catch (Exception e) {
		MessageBox.Show(e.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
	} finally {
		// und wieder freigeben
		if (mutex != IntPtr.Zero) {
			ReleaseMutex(mutex);
		}
	}
   
}
}

1 Kommentare zum Snippet

herbivore schrieb am 08.12.2006:
Mit der Mutex- oder der EventWaitHandle-Klasse stehen in .NET direkt die nötigen Methoden bereit. Ein Durchgriff mit DllImport auf Win32 nicht nicht (mehr) nötig.
 

Logge dich ein, um hier zu kommentieren!