
28 August 2009, 16:41 von
klaus_b2851 mal gelesen.…war eine Frage auf codekicker.de. Aus der Frage entwickelte sich eine interessante Diskussion rund um die verschiedenen Möglichkeiten dies zu Bewerkstelligen.
Einer der ersten Vorschläge war die Verwendung eines Mutex, gefolgt von der Verwendung einer Datei deren Anwesenheit die Ausführung der Anwendung signalisiert.
Mein persönlicher Favorit ist nach wie vor die Verwendung der systemeigenen Prozessliste, in der jeder ausgeführte Prozess vom System erfasst und aufgeführt wird. GENiALi brachte daraufhin den Einwand:
“ Nach dem Prozess suchen? Wenn der User mal ein Progi umtauft, von app.exe auf Application.exe? Dann wird nichts mehr daraus. “
Damit hat er prinzipiell Recht, wenn man den Namen der Anwendung “hart verdrahtet”. Ich habe nie erwähnt, den Namen der Anwendung irgendwo zu hinterlegen.
Genau dafür bietet die Process-Klasse die statische Methode GetCurrentProcess an. mit dieser Methode wird der aktuelle Prozess der aufrufenden Methode in eine Instanz der Process-Klasse zurückgegeben. In dieser Process-Instanz ist jetzt alles nötige enthalten. Die ID des Prozess genauso wie der Name. Über das Hauptmodul des Prozess, zu erhalten über die Eigenschaft MainModule der Process-Instanz, kann auch der komplette Pfad zu Vergleichen herangezogen werden. Verpackt in ein paar Zeilen Code, lässt sich damit eine sehr effektive Methode erstellen, die sehr zuverlässig die Einmaligkeit der Ausführung einer Anwendung gewährleistet.
/// <summary>
/// Prüft ob die Anwendung bereits ausgeführt wird.
/// </summary>
/// <returns>
/// <c>true</c> wenn die Anwendung bereits läuft,
/// anderenfalls <c>false</c>.
/// </returns>
/// <remarks>n/a</remarks>
private static bool AlreadyRunning()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(
current.ProcessName);
foreach (Process process in processes)
{
if (process.Id != current.Id)
{
if (Assembly.GetExecutingAssembly().Location
.Replace("/", "\\") == current.MainModule.FileName)
{
return true;
}
}
}
return false;
}Somit lässt sich in einem einzigen Statement prüfen ob die Anwendung bereits läuft oder nicht.
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (Program.AlreadyRunning())
{
Application.Exit();
return;
}
Application.Run(new Form1());
}Dabei sollte es keine Rolle spielen ob die Anwendung eine Konsolenanwendung, eine Windows Forms Anwendung oder eine WPF Anwendung ist.
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitte "kicken" sie ihn.
