Sprache: C#
Mit diesem Code kann ermittel werden ob das Programm schon läuft. so kann verhindert werden das es mehrfach ausgeführt wird.
using System.Diagnostics;
string StartTaskname = "MeinProgrammName"; // Taskname
int ProgrammOK = 0;
public void FirstRun()
{
// Pragamm nicht mehrmals Starten
int ProgrammCount = 0;
Process[] ProgrammTask = Process.GetProcesses();
foreach (Process ScannTask in ProgrammTask)
{
if (ScannTask.ProcessName == StartTaskname) ProgrammCount = ProgrammCount + 1;
}
if (ProgrammCount > 0)
{
MessageBox.Show("ErrornDas Programm kann nicht mehrmals gestartet werden.", "Programm Error.", MessageBoxButtons.OK, MessageBoxIcon.Error);
ProgrammOK = 1;
this.Close();
}
else
{
ProgrammOK = 0;
// Weitere Programm Code´s
//...
}
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
ProgrammStart();
}
catch
{
// Fehler
//...
}
}
using System.Diagnostics;
string StartTaskname = "MeinProgrammName"; // Taskname
int ProgrammOK = 0;
public void FirstRun()
{
// Pragamm nicht mehrmals Starten
int ProgrammCount = 0;
Process[] ProgrammTask = Process.GetProcesses();
foreach (Process ScannTask in ProgrammTask)
{
if (ScannTask.ProcessName == StartTaskname) ProgrammCount = ProgrammCount + 1;
}
if (ProgrammCount > 0)
{
MessageBox.Show("ErrornDas Programm kann nicht mehrmals gestartet werden.", "Programm Error.", MessageBoxButtons.OK, MessageBoxIcon.Error);
ProgrammOK = 1;
this.Close();
}
else
{
ProgrammOK = 0;
// Weitere Programm Code´s
//...
}
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
ProgrammStart();
}
catch
{
// Fehler
//...
}
}
Alte URL:
/snippet/programm-run-check/1408
Ich weiss das “ ProgrammOK = 1; “ überflüssig ist! Aber falls sich das Programm irgendeine Grund NICHT beendet hab ich nich eine Sicherung!
Das Problem lässt sich wesentlich einfacher mit einem Mutex lösen:
Zum Beispiel:
[code]bool instanziert;
Mutex mutex = new Mutex(false, „Local\“ + programmName, out instanziert);[/code]
(http://en.csharp-online.net/CSharp_FAQ:_How_ensure_that_only_one_instance_of_an_application_will_run)
Mir gefällt die Lösung von Kosmo. Die verlinkte Lösung mit dem Socket ist dagegen ein wenig komisch.. ^^
Schön wäre ein Tip, mit dem man das evtl. schon gestartete Programm in den Vordergrund holt.
Das Ganze funktioniert auf einem Terminal Server nicht, da kann das Programm in einer anderen Session bereits gestartet sein und das wäre dann OK. Daher zusätzlich mit EigenerProzess = Process.GetCurrentProcess den eigenen Prozess holen auf ScannTask.SessionID <> EigenerProzess.SessionID vergleichen.
Den Zähler kann man dann vermeiden, indem man auch noch auf ScannTask.Id <> EigenerProzess.Id vergleicht.
Warum den Code nicht in die Main() schreiben?
Spart das Laden der Form;
@Martin,
Weil das ein teile eine Klasse ist und ich nicht die ganze Klasse hir rein setzten wollte. Es ist nur als Demo ich schreib in “ Form1_Load “ nur die Aufrufe
so halt ich den ganzen Quelltext sauber.
MFG Oliver G